1 在类方法中使用virtual
2 类继承时使用virtual
3 纯虚函数
4 动态绑定
一 在类方法中使用virtual
如下:A类中的方法display()为虚函数,B类继承A类,并且重写了A类中的display()函数
在调用display函数时会根据实例化对象来判定调用那个函数,如下例中会输出B
如果去掉virtual,则使用dodisplay编译时会默认A下的display函数
#include<iostream>
using namespace std;
class A {
public:
virtual void display()
{
cout << "A" << endl;
}
};
class B : public A {
public:
void display()
{
cout << "B" << endl;
}
};
void doDisplay(A *p) {
p->display();
delete p;
}
int main()
{
doDisplay(new A());
doDisplay(new B());
return 0;
}
二 类继承时使用virtual
#include<iostream>
using namespace std;
class Person{
public:
Person() {
name = new char[16];
cout<<"Person构造"<<endl;
}
virtual ~Person() {
delete []name;
cout<<"Person析构"<<endl;
}
private:
char *name;
};
class Teacher :virtual public Person{
public:
Teacher(){
cout<<"Teacher构造"<<endl;
}
~Teacher(){
cout<<"Teacher析构"<<endl;
}
};
class Student :virtual public Person{
public:
Student(){
cout<<"Student构造"<<endl;
}
~Student(){
cout<<"Student析构"<<endl;
}
};
class TS : public Teacher,public Student{
public:
TS(){
cout<<"TS构造"<<endl;
}
~TS(){
cout<<"TS析构"<<ENDL;
}
};
int main(int argc,char* argv[]){
Person *p = new TS();
delete p;
return 0;
}
如果不使用虚继承,结果如下:
使用虚继承,为了防止二义性的的产生(产生编译错误)以及节省存储空间
https://blog.csdn.net/ring0hx/article/details/1605254
注意使用虚继承时基类的析构函数前一定要加 virtual,否则使用delete时只会调用基类的析构函数,派生类中的一些存储空间可能得不到释放,导致出现类存泄露,运行代码时会出现中断(具体原因未知)
https://blog.csdn.net/u014453898/article/details/60402586
三 纯虚函数
C++语言为我们提供了一种语法结构,通过它可以指明,一个虚拟函数只是提供了一个可被子类型改写的接口。但是,它本身并不能通过虚拟机制被调用。这就是纯虚拟函数(pure
virtual function)。 纯虚拟函数的声明如下所示:
class Query {
public:
// 声明纯虚拟函数
virtual ostream& print( ostream&=cout ) const = 0;
// ...
};
这里函数声明后面紧跟赋值0。
包含(或继承)一个或多个纯虚拟函数的类被编译器识别为抽象基类。试图创建一个抽象基类的独立类对象会导致编译时刻错误。(类似地通过虚拟机制调用纯虚拟函数也是错误的例如)
// Query 声明了纯虚拟函数
// 所以, 程序员不能创建独立的 Query 类对象
// ok: NameQuery 中的 Query 子对象
Query *pq = new NameQuery( "Nostromo" );
// 错误: new 表达式分配 Query 对象
Query *pq2 = new Query;
抽象基类只能作为子对象出现在后续的派生类中。
四 动态绑定
定义对象时为什么要加一个&符号?
加&表示引用。引用的意思就是起个别名,但还在用原来的变量。
int a=10;
int &b=a; //b是a的引用,加后对b操作就是对a操作!
b=20;
cout<<a<<endl; 结果是 20.
不加就不是引用。
参考:
https://blog.csdn.net/jirryzhang/article/details/79392934
https://blog.csdn.net/weibo1230123/article/details/77837688