第十五章——抽象类,切片,多继承
2013-11-15 09:18
204 查看
//可以使用抽象类的指针或引用。抽象类里的纯虚函数可以是有函数体。任何情况下都不能得到抽象类的对象,抽象类和普通类的区别是,抽象类不能实例化
//牢记实现虚机制的要求virtual
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
切片
void main() {
B wo;
A ni=wo;
}如果对一个对象进行向上类型转换,而不使用地址或引用,这个对象被“切片”,只剩下来的是适合于目的的子对象。(不提倡使用)
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
多继承的易错点
//如果在一个子类继承的多个父类中拥有相同函数,子类中没有覆盖该函数,那么调用该函数时将产生歧义
///如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量.
//牢记实现虚机制的要求virtual
#include <iostream> using namespace std; class Pet {//抽象类 public: static int i;///////////////////////抽象类的数据 virtual void speak() = 0;///纯虚函数也可以有函数体 virtual void eat() = 0; virtual void kkk();////////////////非纯虚函数 }; int Pet::i=1; void Pet::speak() { cout << "Pet::speak()" <<i++<< endl; } void Pet::eat() { cout << "Pet::eat()" <<i++<< endl; } void Pet::kkk() { cout << "kkk()" <<i++<< endl; } class Dog : public Pet { public: void speak() { Pet::speak();}//重定义纯虚函数 void eat() { Pet::eat(); }////这貌似是自身重定义 }; void main() { Dog simba; Pet *pt=&simba;//指针 pt->speak(); pt->eat(); pt->kkk();///调用基类的非纯虚函数 cout<<endl; Dog &wt=simba;//引用 wt.speak(); wt.eat(); wt.kkk();///调用基类的非纯虚函数 cout<<endl; //Pet a=simba;这句是编译不过的,因为父类是抽象类,不允许“切片”得到抽象类的对象 }
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
切片
void main() {
B wo;
A ni=wo;
}如果对一个对象进行向上类型转换,而不使用地址或引用,这个对象被“切片”,只剩下来的是适合于目的的子对象。(不提倡使用)
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
多继承的易错点
#include <iostream> using namespace std; class a { public: virtual void kk(){}//虚函数是有函数体的 }; class P : public a{ public: virtual void kk(){cout<<"pppppp";} }; class M : public a{ public: virtual void kk(){cout<<"mmmmmm";} }; class Child : public P,public M{//去掉其中一个才能通过编译 public: }; void main() { a *pt=new Child();//: error C2594: “初始化”: 从“Child *”到“a *”的转换不明确 pt->kk(); } ///:~
//如果在一个子类继承的多个父类中拥有相同函数,子类中没有覆盖该函数,那么调用该函数时将产生歧义
///如果在一个子类继承的多个父类中拥有相同名字的实例变量,子类在引用该变量时将产生歧义,无法判断应该使用哪个父类的变量.
相关文章推荐
- OOP设计思考——究竟是继承自普通类,还是继承自抽象类?
- 面向对象(继承,重写,this,super,抽象类)
- Java基础 面向对象(3) 继承 final关键字 抽象类 接口
- Javaweb微专业第十一讲-----继承与抽象类
- (26)抽象类引入、特点、和一般类区别、抽象继承练习
- JAVA 继承基本类、抽象类、接口
- java继承、多台、抽象类概念
- asp.net 中类,继承,抽象类,接口的定义方法?还有区别是什么?
- 继承,抽象类,接口,多态
- C# 抽象类的继承类可直接访问基类的实例对象
- C++程序示例:涉及到抽象类、继承…
- 子类A继承抽象类B,就一定要重写B的抽象方法
- 抽象类是否能继承实体类
- java之7天 继承,final,接口,抽象类
- PHP 面向对象:抽象类继承抽象类
- 抽象类是否可以继承实体?可以继承
- 继承,抽象类
- 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类
- C++ Pirmer : 第十五章 : 面向对象程序设计之基类和派生的定义、类型转换与继承与虚函数
- 类、抽象类、接口、继承和对象