c++ virtual初步解析

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

Base
bDerived=newDerived();



bBase->NonVirtual();

bBase->Virtual();

bDerived->NonVirtual();

bDerived->Virtual();

}Base NonVirtual called.

Base Virtual called.

Base NonVirtual called.

Derived Virtual called.

虚继承

为了解决“钻石问题”而提出的方法。继承关系如下:c++ virtual初步解析c++ virtual初步解析这样,若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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月10日 上午12:34
下一篇 2023年2月10日 上午12:34

相关推荐