2014-12-08 82 views
1

这是简单的代码我处理,以了解继承下来铸造了铸件等类继承和上溯造型在C++

class A 
{ public: 
    void p() {cout << “A::p\n”;} 
    virtual void q() {cout << “A::q\n”;} 
}; 

class B : public A 
{ public: 
    void p() { cout << “B::p\n”;} 
    void q() { cout << “B::q\n”;} 
}; 

int main() 
{ A* a1 = new B; 
    a1 -> p(); 
    a1 -> q(); 
} 

其次是我的预期输出

B::p 
B::q 

以下是实际输出

A::p 
B::q 

我的理解是,B类是继承类A.然后我在主体中,我们创建了一个指向A类的指针,并将它的引用设置为B.因此,当我们调用函数p()和q()时,我期望B类内部的任何内容都可以打印。

任何人都可以澄清我的误解吗?

+1

您正在调用基类指针上的非虚方法 - 您为什么期望派生类的重写被调用?这正是“虚拟”的意义所在 - “A :: p”不是。 – 2014-12-08 04:37:51

+1

你究竟在哪里上传任何东西? – Blindy 2014-12-08 04:39:30

+0

@Bindind:在'A * a1 = new B;'中。从指针到派生到指向基础的指针(无论是隐式还是其他)通常俗称为“向上”(因为您正在向上“继承”继承层次结构)。反向 - 总是显式的 - 投射然后是“低调”。 – 2014-12-08 05:03:19

回答

2

你会发现这两种方法之间的区别在于,一个被标记virtual基类A,另一种是不:

方法Q被定义为

virtual void q() 

在基类,而p是只是

void p() 

因此,

A* a1 = new B; 
a1 -> p(); ... Uses a1's type to determine the method, statically 
a1 -> q(); ... Uses virtual method table to determine the method at run time