MyException - 我的异常网
当前位置:我的异常网» C++ » 对virtual又有点迷惑了

对virtual又有点迷惑了

www.MyException.Cn  网友分享于:2013-02-20  浏览:1次
对virtual又有些迷惑了
#include<iostream>
#include<string>
using namespace std;
class A
{
public:
void fA() { cout<<"A::fA"<<endl; }
virtual void vfA() { cout<<"A::vfA"<<endl; }
};

class B:public A
{
public:
void fB() { cout<<"B::fB"<<endl; }
void vfA() { cout<<"B::vfA"<<endl; }
};

class C:public B
{
void fC()  { cout<<"C::fC"<<endl; }
void vfA() { cout<<"C::vfA"<<endl; }
};

int main()
{
A *p=new C;
p->vfA();
system("pause");
return 0;
}


说说看你认为的答案是什么,先谢谢大家。

------解决方案--------------------
C::vfA
------解决方案--------------------
有什么疑问?
------解决方案--------------------
是 C::vfA没错的。

------解决方案--------------------
如果不是 C::vfA才不好理解呢。
你试试这段(A,B,C定义不变,只更改main)

int main()
{
    A a1, a2;
    B b1, b2;
    C c1, c2;
    A* p[6] = {&a1, &a2, &b1, &b2, &c1, &c2};
    for (int i = 0; i < 6; ++i)
    {
        p[i]->vfA();
    }
    system("pause");
    return 0;
}

这是虚函数的强大的功能和作用之一吧。
------解决方案--------------------
类C都重定义了
void vfA() { cout<<"C::vfA"<<endl; }

不管如何都会输出C::vfA;
------解决方案--------------------
运行一下就知道:
C::vfA
Press any key to continue

------解决方案--------------------

//不建议的写法:
A* p = new C;

//建议的写法:
A* p = new C();

------解决方案--------------------
引用:
引用:是 C::vfA没错的。

我以为C继承B,B中vfa不是virtual 我以为输出B::vfA呢

只要基类写了vfA是virtual,继承类中vfA就始终是virtual,不管继承类声明时写不写virtual

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有