我有以下代码:

main.hxx:

#include <iostream>

class Base{
public:
    Base() {}
    ~Base() {}

    virtual void whoAreYou() { std::cout << "I am base!" << std::endl;}
};

class Sub : public Base{
public:
    Sub() {}
    ~Sub() {}

    virtual void whoAreYou() { std::cout << "I am Sub!" << std::endl;}
};

class Factory {

public:
    static Base getBase() { return Base(); }

    static Base* getBasePtr() { return new Base(); }

    static Base getSub() { return Sub(); }

    static Base* getSubPtr() { return new Sub(); }
};


main.cxx

#include "main.hxx"

int main (int argc, char **argv) {

    // Non pointers
    Factory::getBase().whoAreYou();
    Factory::getSub().whoAreYou();

    // Pointers
    Base* basePtr = Factory::getBasePtr();
    Base* subPtr = Factory::getSubPtr();
    basePtr->whoAreYou();
    subPtr->whoAreYou();

    delete basePtr, subPtr;

    return 0;
}


运行时,将打印以下内容:

I am base!
I am base!
I am base!
I am Sub!


我期望“ Factory :: getSub()。whoAreYou();”打印“我是潜艇!”。是否因为不使用指针而将其强制转换为Base?

最佳答案

我期望Factory::getSub().whoAreYou();打印“我是潜艇!”。


不,该函数返回一个Base,因此您将得到一个Base


  是否因为不使用指针而将其强制转换为Base?


是的(尽管单词是“转换的”而不是“转换的”,类型转换是显式转换,并且此转换是隐式的)。有时将其称为“切片”,因为对象的派生类部分在复制时被“切片”。

另外,请注意以下几点:

delete basePtr, subPtr;


仅删除subPtr。您需要为每个单独的删除表达式。您还需要Base中的虚拟析构函数才能安全地删除subPtr

关于c++ - 调用子类方法。指针与非指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20148900/

10-14 18:39
查看更多