指针与继承的关系 c++ oop
Posted
技术标签:
【中文标题】指针与继承的关系 c++ oop【英文标题】:Relationship between pointer and inheritance c++ oop 【发布时间】:2018-10-10 20:48:38 【问题描述】:谁能写一段c++的简短代码,说明指针和继承之间的关系。
我相信下面的代码是指我的问题
class Animal
public:
virtual void MakeSound(const char* pNoise) ...
virtual void MakeSound() ...
;
class Dog : public Animal
public:
virtual void MakeSound() ...
;
int main()
Animal* a = new Dog();
Dog* d = new Dog();
a->MakeSound("bark");
d->MakeSound("bark"); // Does not compile
return 0;
【问题讨论】:
【参考方案1】:您隐藏基类MakeSound
并覆盖其他MakeSound
,因此它不参与重载决议。在 Dog
中覆盖两者或都不覆盖,或者将其中之一重命名为 MakeNoise
。
【讨论】:
有人可以用完整的代码分享一个正确的解决方案吗? 解决什么问题?您发布了格式错误的程序,我列出了 3 种修复方法。 你能告诉我好不好用吗?虚空 MakeSound() ; int main() Animal* a = new Dog();狗* d = 新狗(); a->MakeSound("吠声"); d->MakeNoise("吠声"); // 不编译 return 0; 如果你真的想要,你可以拨打d->Animal::MakeSound("bark")
,但我不认为这是推荐的做法【参考方案2】:
这两者实际上几乎没有什么关系,一个交叉点是为了利用多态行为(虚拟成员),您必须使用指针或引用。如果您将派生实例分配给实际的基实例(而不是将派生的地址分配给基指针或使用派生实例初始化基引用),那么任何派生功能都将简单地丢失(通常称为该对象切片)。
请注意,在您的示例中,没有太多指向虚拟 void make_sound(char const *),更常见的是使用虚拟 void make_sound() 形式,并且派生类型知道要产生什么样的声音.
【讨论】:
你能推荐一个详细的代码来满足我的要求吗?以上是关于指针与继承的关系 c++ oop的主要内容,如果未能解决你的问题,请参考以下文章