C++中的多态(意外行为)

wai*_*r92 1 c++ polymorphism inheritance virtual-functions

我有以下三个课程:

class A
{
private:
    std::string device;
public:
    std::string getDeviceType() { return device; };
    void setDeviceType(std::string device) { device = device; };
    virtual void doSomething() = 0;
    virtual void doSomething2() = 0;
};

class B: public A
{
    private:
    public:
        B(){ ; };
        virtual ~B(){ ; };
        void doSomething() { std::cout << "I am usual B" << std::endl; };
        void virtual doSomething2() { std::cout << "I am usual B" << std::endl; };
};

class C : public B
{
private:
public:
    C(){ ; };
    ~C(){ ; };
    void doSomething() { std::cout << "I am C" << std::endl; };
    void doSomething2() { std::cout << "I am C" << std::endl; };
};
Run Code Online (Sandbox Code Playgroud)

主要:

B *myHandler = new C();
myHandler->doSomething();
myHandler->doSomething2();
Run Code Online (Sandbox Code Playgroud)

但输出不是预期的,我的预期输出是I am usual B,然后I am C,因为doSomething()是一个非虚拟的类成员B.但真正的输出是I am C然后I am C.你知道为什么吗?

Nat*_*ica 6

因为doSomething()是B类的非虚拟成员

这是你错的地方.在A你声明doSomething()virtual.这意味着它在从它派生的类中隐式标记为虚拟.所以,doSomething()Bvirtual这意味着你打电话CdoSomething().