我试图理解C ++中虚函数的概念,我在线阅读但是我无法理解为什么下面的程序输出是2而不是1?谁能解释一下?
Class A
{
int a;
public:
A()
{
a = 1;
}
virtual void show()
{
cout <<a;
}
};
Class B: public A
{
int b;
public:
B()
{
b = 2;
}
virtual void show()
{
cout <<b;
}
};
int main()
{
A *pA;
B oB;
pA = &oB;
pA->show();
return 0;
}
答案 0 :(得分:1)
虚函数是成员函数,其行为可以在派生类中重写。与非虚函数相反,即使没有关于类的实际类型的编译时信息,也会保留被覆盖的行为。 如果使用指针或对基类的引用处理派生类,则对重写的虚函数的调用将调用派生类中定义的行为。如果使用限定选择函数,则会禁止此行为名称查找(即,如果函数的名称出现在作用域解析运算符的右侧::)
由于您在课程show()
中取代B
,pA->show()
会在课程show()
中致电B
。祝希望这有帮助
答案 1 :(得分:1)
通过覆盖虚函数和指针实现多态性: 在你的例子中,你使用pA多态,所以它是一个指向基类(A)的指针,但是你给它分配了一个B类的对象,它是A的子对象。 并且您将Show()声明为虚拟。
这是多态性的主要目标;这意味着我们不知道基本指针指向的对象类型,直到运行时,例如在main中:
int main()
{
int choice;
cout << "1: A object 2: B object:\n\n";
cin >> choice;
if(1 == choice)
pA = new A; // result will be 1
else
if(2 == choice)
pA = new B; // result will be 2
if(pA)
pA->show();
delete pA;
pA = NULL;
// B* pB = new A; // error: cannot convert from class A* to class B* because C++ is not contravariant
B* pB = new B;
pB->show(); // result: 2
delete pB;
pB = NULL;
return 0;
}