我有以下代码:
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/