📜  C ++ |继承|问题11(1)

📅  最后修改于: 2023-12-03 15:13:45.257000             🧑  作者: Mango

C++ 继承问题11

介绍

在 C++ 中,继承是重用已有代码的一种方式。子类可以从父类中继承(或派生)属性和方法,然后根据需要进行修改或添加新的特性。

继承分为不同类型,包括公有继承、私有继承和受保护的继承。在这个问题中,我们将讨论公有继承和私有继承的差异。

公有继承

当使用公有继承时,子类可以访问父类的公有成员和保护成员。私有成员则不可访问。

下面是一个使用公有继承的示例代码:

class Animal {
public:
    void eat() {
        cout << "Animal is eating.\n";
    }
};

class Dog : public Animal {
public:
    void bark() {
        cout << "Dog is barking.\n";
    }
};

int main() {
    Dog myDog;
    myDog.eat();    // 可以访问父类的 eat() 方法
    myDog.bark();   // 可以访问子类的 bark() 方法
    return 0;
}

可以看到,在上面的示例中,子类 Dog 继承了父类 Animaleat() 方法,并添加了自己的 bark() 方法。在 main() 函数中,可以通过 myDog.eat() 访问 Animal 类的 eat() 方法。

私有继承

当使用私有继承时,子类可以访问父类的公有成员和保护成员,但这些成员均将变成子类的私有成员,因此在子类中这些成员无法再被访问。

下面是一个使用私有继承的示例代码:

class Animal {
public:
    void eat() {
        cout << "Animal is eating.\n";
    }
};

class Dog : private Animal {
public:
    void bark() {
        cout << "Dog is barking.\n";
    }
};

int main() {
    Dog myDog;
    myDog.eat();    // 编译错误,无法访问私有的 Animal::eat() 方法
    myDog.bark();   // 可以访问子类的 bark() 方法
    return 0;
}

可以看到,在上面的示例中,子类 Dog 私有继承了父类 Animal,因此 myDog.eat() 会导致编译错误。只有 Dog 的成员函数可以访问 Animal 类的公有成员和保护成员。

总结

公有继承和私有继承的主要区别在于可访问性。公有继承可以访问父类的公有成员和保护成员,私有继承仅限于子类的成员函数访问。选择哪种继承类型取决于具体情况和设计需求。