1.多继承可能会出现奇葩现象,多个同样的变量,导致子类不知道调用的那个变量来自哪个父类。
2.如果一个外部方法的参数是父类,那么即使传了一个子类,在方法中调用这个类的内部方法,不管你传入的是子类还是父类,都会强行给你调用父类的方法。因为编译器认为这样是安全的,这个方法一定在父类中可以找得到,哪怕你子类也定义了自己的方法。
关键字virtual用于父类方法,如果传了一个子类对象,并且子类重写了父类的这个virtual方法,就会调用子类的方法。传谁就调用谁,这个就是多态。我记得java是先在子类那里找,没有才回去父类。使用虚函数:
没有使用:
不具备多态性
#include<iostream> using namespace std; class A { public: A() { //用x表示遇到A的默认构造函数 this->name = 'x'; } A(char name) { this->name = name; } virtual void run() { cout<<"A run ,actual object is:"<<this->name<<endl; } char name; }; //run方法用来测试多态 class B:virtual public A { public: B(char name):A(name) { this->name = name; } void run() { cout<<"B run ,actual object is:"<<this->name<<endl; } }; //虚继承A class C:virtual public A { public: C(char name):A(name) { this->name = name; } void run() { cout<<"C run ,actual object is:"<<this->name<<endl; } }; //多继承与虚继承 //谁继承在后,那么会出现歧义的那个变量就归谁管。 class D:public B,public C { public: D(char bname,char cname):B(bname),C(cname) { } //一定要重写这个方法,不然run方法又要模棱两可了 //反正不写会报错 void run() { cout<<"D run ,actual object is:"<<this->name<<endl; } }; void start(A& a) { a.run(); } int main() { A a('a'); B b('b'); D d('b','c'); start(a); start(b); //如果d的父类不采用虚继承的方式继承父类,那么这里会出现指代不明 cout<<b.name<<endl; //如果不虚继承,就会报错 cout<<d.name<<endl; //没有父类虚继承爷爷,子类就要向下面这么写 //cout<<d.B::name<<'\t'<<d.C::name<<endl; return 0; }