【问题标题】:Virtual function behavior on statically declared objects [duplicate]静态声明对象的虚函数行为[重复]
【发布时间】:2014-08-04 11:40:11
【问题描述】:

考虑以下代码:

class A {
public:
    virtual void hello() { std::cout << "Hello from A" << std::endl; }
    void hi() { std::cout << "Hi from A" << std::endl; }
};

class B : public A {
public:
    void hello() { std::cout << "Hello from B" << std::endl; }
    void hi() { std::cout << "Hi from B" << std::endl; }
};

int main() {
    A foo = B();
    foo.hello();    // prints "Hello from A"
    foo.hi();       // prints "Hi from A";

    A *bar = new B();
    bar->hello();   // prints "Hello from B"
    bar->hi();      // prints "Hi from A"
}

我知道,由于hello() 被声明为A 类中的虚函数,所以B 类的任何对象都应该具有被覆盖的行为。但是,为什么对象foo 不调用被覆盖的hello()

换句话说,这两种对象构造方法在哪些方面不同? A foo = B(); v/s A *bar = new B()?

谢谢!

【问题讨论】:

    标签: c++ class virtual-functions


    【解决方案1】:

    在第一种情况下,您做错了什么:slicing 这是“切除对象的一部分”,因为您将派生对象分配给基础对象。您没有使用虚拟多态性,因为您只是在“切片”派生对象上调用方法(这甚至不安全)。

    虚拟多态性与指向派生对象的基类指针和覆盖的虚拟函数一起使用,这是一种安全的运行时机制,可以专门化您的对象并调用适当的方法。

    【讨论】:

    • 感谢清晰的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    相关资源
    最近更新 更多