2011-01-28 32 views
7

我有两个类:问虚函数

class x { 
public: 
    virtual void hello() { 
    std::cout << "x" << std::endl; 
    } 
}; 

class y : public x { 
public: 
    void hello() { 
    std::cout << "y" << std::endl; 
    } 
}; 

有人可以解释为什么以下两个调用为hello()打印不同的消息?他们为什么不打印“y”?是因为第一个是副本,而第二个实际指向内存中的对象?

int main() { 
    y a; 

    x b = a; 
    b.hello(); // prints x 

    x* c = &a; 
    c->hello(); // prints y 
    return 0; 
} 
+3

我觉得这是我第一次看到有人正确猜出原因,做得不错。 – GManNickG 2011-01-28 07:02:47

回答

6

是的,你是对的

x b = a; 

调用拷贝构造函数(B是一个 'x')

x& b = a; 

分配的参考,并使用覆盖(B仍实际上是一个'y')

0

x b = a将a复制到b。由于b是类型x,所以最终得到一个x类型的对象。 x类型的对象将打印x。

获得y的唯一方法是当您调用y类型的对象时。

6

因为x b = a;slices的对象。

当此代码执行时,它会创建一个新的x,而不是一个y,这是原来的ya”的副本。

+1

谢谢,我学到了一个新的词汇单词 – Marlon 2011-01-28 07:05:25

0

b.hello()打印“X”,因为b是类X. c->hello()打印“Y”,因为ca一个实例,a是类Y的一个实例

什么可能是混淆了你的是,当您编写x b = a;时,您正在创建一个新对象b并使用a对其进行初始化。当你写x* c = &a;c不是一个新的对象。您只是向现有对象引入了别名。