c++ virtual初步解析
总结: virtual主要用于实现多态,使用场合是: 通过基类指针操作子类,在运行期动态选择子类方法而实现了多态。
虚函数和纯虚函数
虚函数可以被子类重写,纯虚函数必须被子类重写。 虚函数是实现多态所必需的。发生继承操作时,同时继承基类所有的可继承项(public or proteced修饰)。倘若基类方法未用virtual修饰,使用基类指针调用子类方法时,输出的将是基类的方法!因为在编译期时把基类指针指向子类,运行期仍是执行基类,所以调用的是基类方法;若采用virtual修饰,则是在运行期时动态选择子类方法,从而实现了多态。见 stackoverflow : http://stackoverflow.com/questions/1306778/c-virtual-pure-virtual-explained#include<iostream>
usingnamespacestd;
classBase {
public:
voidNonVirtual() {
cout<<"Base NonVirtual called.\n";
}
virtualvoidVirtual() {
cout<<"Base Virtual called.\n";
}
};
classDerived:publicBase {
public:
voidNonVirtual() {
cout<<"Derived NonVirtual called.\n";
}
voidVirtual() {
cout<<"Derived Virtual called.\n";
}
};
intmain() {
BasebBase=newBase();
BasebDerived=newDerived();
bBase->NonVirtual();
bBase->Virtual();
bDerived->NonVirtual();
bDerived->Virtual();
}Base NonVirtual called.
Base Virtual called.
Base NonVirtual called.
Derived Virtual called.
虚继承
为了解决“钻石问题”而提出的方法。继承关系如下:这样,若B,C不虚继承自A, 那么D中将有两份A类的成员Foo。 在D的实例调用Foo方法时,就不知道是从B.Foo 还是 C.Foo了。若采用了虚继承,那么D中仅有一份Foo,就很明确了。参考: http://stackoverflow.com/questions/21558/in-c-what-is-a-virtual-base-class#21607
虚析构函数
当基类指针指向子类实例,进行删除时,必须将基类的析构函数定义为virtual.classBase {
// some virtual methods};
classDerived:publicBase{
~Derived()
{
// Do some important cleanup
}};Baseb=newDerived();
// use b
delete*b;// Here's the problem!<span class="pun"><span style="color: rgba(0, 128, 0, 1)"><span id="_baidu_bookmark_start_" style="line-height: 0; display: none"></span><span id="_baidu_bookmark_start_" style="line-height: 0; display: none"></span><span id="_baidu_bookmark_start_" style="line-height: 0; display: none"></span><span id="_baidu_bookmark_start_" style="line-height: 0; display: none"></span><span id="_baidu_bookmark_start_" style="line-height: 0; display: none"></span><span id="_baidu_bookmark_start_" style="line-height: 0; display: none"></span><span id="_baidu_bookmark_start_" style="line-height: 0; display: none"></span><span id="_baidu_bookmark_start_" style="line-height: 0; display: none"></span><span id="_baidu_bookmark_start_" style="line-height: 0; display: none"></span></span></span>
原文链接: https://www.cnblogs.com/IntellX/archive/2013/05/28/3104870.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/90297
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!