c++基础 - 虚继承/虚函数

353 阅读3分钟

虚继承

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();
}