【问题标题】:Relationship between pointer and inheritance c++ oop指针与继承的关系 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; 
}

【问题讨论】:

    标签: c++ oop pointers inheritance relationship


    【解决方案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() 形式,并且派生类型知道要产生什么样的声音.

    【讨论】:

    • 你能推荐一个详细的代码来满足我的要求吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多