2.使用基类:在派生类的成员初始化列表中使用 base(Arg…) 进行父类的初始化。在派生类其他位置使用 base 获得基类对象。
时间: 2025-03-25 19:19:46 浏览: 26
### C++ 中通过 `base` 关键字初始化基类
在 C++ 中,虽然不像某些其他语言(如 C# 或 Java)那样显式使用 `base` 关键字来调用基类构造函数,但在派生类的构造函数中可以通过 **成员初始化列表** 来实现这一功能。具体来说,在派生类的构造函数定义时,可以在初始化列表部分指定要调用的基类构造函数。
以下是关于如何在派生类中正确初始化基类并访问基类成员的关键点:
#### 1. 派生类构造函数中的基类初始化
如果基类具有带有参数的构造函数,则在其派生类的构造函数中必须显式调用该基类构造函数。这通常通过成员初始化列表完成[^5]。如果没有显式的调用,默认情况下会尝试调用基类的无参构造函数。如果不存在这样的构造函数,则会导致编译错误。
```cpp
class Base {
public:
int base_val;
Base(int val) : base_val(val) {} // 基类构造函数
};
class Derived : public Base {
public:
int derived_val;
// 调用基类构造函数,并初始化派生类成员
Derived(int b, int d) : Base(b), derived_val(d) {}
};
```
上述代码展示了如何在派生类 `Derived` 的构造函数中通过初始化列表调用基类 `Base` 的构造函数[^1]。
#### 2. 默认构造函数的行为
如果不显式调用基类构造函数,而基类存在默认构造函数,则会自动调用它。然而,如果基类没有提供默认构造函数,则需要手动指定具体的构造函数[^2]。
#### 3. 访问基类成员
在派生类中可以直接访问基类的公有和受保护成员。对于私有成员,由于其封装特性,无法被派生类直接访问[^4]。例如:
```cpp
class Base {
protected:
int protected_member; // 受保护成员可以被派生类访问
private:
int private_member; // 私有成员不可被派生类访问
public:
void setProtectedMember(int value) { protected_member = value; }
int getPrivateMember() const { return private_member; } // 提供接口访问私有成员
};
class Derived : public Base {
public:
void displayMembers() {
// 可以访问受保护成员
std::cout << "Protected Member: " << protected_member << std::endl;
// 不可直接访问私有成员
// std::cout << private_member << std::endl; // 编译错误
}
};
```
#### 4. 复制构造函数的情况
当创建派生类的对象时涉及复制操作,可能会触发基类的复制构造函数。这种情况下,同样需要确保正确地调用基类的相关构造逻辑[^3]。
```cpp
class Test {
private:
int data;
public:
Test(int d) : data(d) {}
// 定义复制构造函数
Test(const Test& other) : data(other.data) {}
};
class SubTest : public Test {
public:
SubTest(const Test& t) : Test(t) {} // 明确调用基类的复制构造函数
};
```
#### 总结
- 在派生类中初始化基类成员需借助成员初始化列表。
- 如果基类提供了多个构造函数选项,则应根据需求选择合适的版本进行调用。
- 对于基类成员的访问权限遵循 C++ 封装原则:仅允许访问公共或受保护的内容;私有内容则受限。
阅读全文
相关推荐


















