c++虚函数和虚继承

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;

}



猜你喜欢

转载自blog.csdn.net/hiudawn/article/details/79996033