除了公有派生,还有哪些派生方式,它们有什么区别
时间: 2024-04-27 11:24:12 浏览: 7
除了公有派生,还有私有派生和受保护的派生两种方式。它们的区别在于派生类对基类成员的访问权限不同。
私有派生方式下,基类的公有成员和保护成员都会变成派生类的私有成员,派生类的对象只能通过派生类的公有和保护成员来访问这些基类成员。
受保护的派生方式下,基类的公有成员和保护成员都会变成派生类的保护成员,派生类的对象和派生类的派生类对象只能通过派生类的公有和保护成员来访问这些基类成员。
相比之下,公有派生方式下,基类的公有成员和保护成员都会成为派生类的公有成员,派生类的对象可以通过派生类的公有成员来访问基类成员。
相关问题
c++公有派生如何定义派生类的构造函数。
在 C++ 中,派生类的构造函数可以调用基类的构造函数来初始化基类的数据成员,而且必须在其初始化列表中显式调用。公有派生可以继承基类的公有成员和保护成员,但不能继承基类的私有成员。因此,在公有派生中,派生类的构造函数应该调用基类的公有构造函数,以初始化基类的公有成员和保护成员。以下是一个公有派生的示例代码:
```
class Base {
public:
Base(int x) : m_x(x) {}
protected:
int m_x;
};
class Derived : public Base {
public:
Derived(int x, int y) : Base(x), m_y(y) {}
private:
int m_y;
};
```
在上面的示例中,派生类 `Derived` 继承了基类 `Base` 的成员变量 `m_x`,并且定义了自己的成员变量 `m_y`。`Derived` 的构造函数将 `x` 传递给 `Base` 的构造函数来初始化 `m_x`,并将 `y` 初始化为 `m_y`。注意,在初始化列表中,我们使用 `:` 来分隔构造函数的参数和成员变量的初始化语句。
如果公有派生,则可以用基类对象的地址赋值给派生类的指针
如果是公有派生,则可以将基类对象的地址赋值给派生类的指针。这是因为在公有派生中,派生类包含基类的所有成员,因此可以将基类指针隐式地转换为派生类指针。这种转换被称为向上转型。例如,假设有一个基类 `Animal` 和一个公有派生类 `Dog`,则可以将 `Animal` 对象的地址赋值给 `Dog` 指针,如下所示:
```
Animal* animal = new Dog();
```
这里,`new Dog()` 创建了一个 `Dog` 对象,并返回该对象的地址,该地址被隐式转换为 `Animal*` 类型,然后赋值给 `animal` 指针。在 `animal` 指针上调用的任何虚函数都将调用 `Dog` 类中的实现,因为 `Dog` 是 `Animal` 的公有派生类。