virtual 关键字

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

猜你喜欢

转载自blog.csdn.net/SenPaul/article/details/83013026
今日推荐