【发布时间】:2019-08-31 03:43:41
【问题描述】:
当我发现我可以像这样使用基类指针来访问派生类时,我并不感到惊讶(非常简单):
class Base
{
protected:
int m_value;
public:
Base(int value)
: m_value(value)
{
}
const char* getName() { return "Base"; }
int getValue() { return m_value; }
};
class Derived: public Base
{
public:
Derived(int value)
: Base(value)
{
}
const char* getName() { return "Derived"; }
int getValueDoubled() { return m_value * 2; }
};
对象派生类创建后会发生什么?如果我使用
Base &rBase = derived;
我将使用在基类中确定的此类方法。为什么?这是否意味着派生类实际上由基类的第一个确定的 getName() 组成,但现在只使用重载方法,如果我们愿意,我们可以通过基类上的指针调用 origin 方法?请根据指针和地址向我解释一下。
【问题讨论】:
-
看起来您实际上并没有在这里使用任何指针(如果您使用
virtual的多态性,这将允许您调用派生函数)。除此之外,我强烈建议您在任何地方使用std::string而不是char *。 -
不幸的是,对于一般情况,不能这样解释。 C++ 标准并未定义多态性的确切工作方式。只定义了必须发生的事情,因此只要他们的解决方案提供正确的结果,实施者就可以进行疯狂的飞行。通常实现将使用所谓的(传入搜索词!)V-Tables,但他们不必这样做。
-
@user4581301 OP 的类中没有多态性。
-
与我的观点无关。你不能用指针和地址来解释多态性,因为知道如何使用仙尘的人不需要这些粗鲁的工具。