虚继承
Java中是不存在多继承,因为会有二义性,不够健壮,c++存在多继承,但是也不允许有二义性。虚继承用来解决二义性。确保继承过来的相同属性或者函数,只存在一份拷贝
class A
{
public:
char * name = "n";
public:
A(){
}
~A(){
}
};
class B :virtual public A
{
};
class C :virtual public A
{
};
class D :public B,public C
{
};
void main(){
D d;
cout << d.name << endl;
getchar();
}
像一下这个例子,存在绝对的二义性。编译器是不通过的。即使像上面的例子,使用virtual关键字可以解决,是因为来自于同一份的name。
class B
{
public:
int age =10;
};
class C
{
public:
int age =11;
};
class D :virtual public B, virtual public C
{
};
void main(){
D d;
cout << d.age << endl;
getchar();
}
c++中的多态
什么是多态? 简单来说:父类的引用指向子类的引用(对象)。也就是里氏替换原则。 子类可以重写父类的方法。 多态分为静态多态和动态多态。 静态多态:在编译的时候就知道调用哪个函数。比如函数的重载,在编译期就知道要调用哪个函数。 动态多态:编译期不知道应该调用哪个函数。比如函数的重写,virtual在父类中使用与否。
静态多态和动态多态的区别在于 编译过程中确定性的区别
在c++中默认是不存在多态;
class Activity
{
public:
void onCreate(){
cout << "Activity onCreate" << endl;
}
private:
};
class MainActivity :public Activity
{
public:
void onCreate(){
cout << "MainActivity onCreate" << endl;
}
private:
};
void main(){
MainActivity * mainActivity = new MainActivity();
mainActivity->onCreate();
getchar();
}
在这个例子中输出的内容为:Activity onCreate 。如果要调用MainActivity里的onCreate,则要在Activity的onCreate函数前使用关键字virtual。该函数为虚函数,支持多态。
虚函数
class Activity
{
public:
virtual void onCreate(){
cout << "Activity onCreate" << endl;
}
private:
};
class MainActivity :public Activity
{
public:
void onCreate(){
cout << "MainActivity onCreate" << endl;
}
private:
};
class WelcomeActivity :public Activity
{
public:
void onCreate(){
cout << "WelcomeActivity onCreate" << endl;
}
private:
};
void startActivity(Activity * activity){
activity->onCreate();
}
void main(){
Activity * mainActivity = new MainActivity();
startActivity(mainActivity);
getchar();
}