最基础的C++继承结构需一个基类和一个派生类,用class Derived : public Base声明;必须显式写public,否则默认私有继承导致无法访问父类public成员;基类带参构造函数需在派生类初始化列表中显式调用。

怎么写一个最基础的 C++ 继承结构
最简继承只需要两个类:一个基类(父类)、一个派生类(子类),用 : 加访问说明符声明继承关系即可。不需要虚函数、不涉及多态,就是纯粹的“子类能直接用父类的 public 成员”。
常见错误是漏写访问说明符(比如写成 class Dog : Animal 而不是 class Dog : public Animal),这时默认是 private 继承,子类对象无法访问父类成员,编译会报错或行为不符合预期。
-
public继承最常用,保持父类public成员在子类中仍是public - 基类构造函数不会自动调用,若基类有带参构造函数,子类必须在初始化列表里显式调用:
Dog() : Animal("dog") {} - 子类定义同名函数会隐藏(不是重载也不是覆盖)父类所有同名函数,哪怕参数不同
一个能直接编译运行的最小完整例子
下面这段代码在 g++/clang/msvc 上都能通过,没有依赖,只用标准头文件:
#include <iostream>
using namespace std;
class Animal {
public:
string name;
Animal(string n) : name(n) {}
void speak() { cout << name << " makes a sound.\n"; }
};
class Dog : public Animal {
public:
Dog() : Animal("Dog") {} // 必须调用基类构造
};
int main() {
Dog d;
d.speak(); // 输出:Dog makes a sound.
cout << d.name << "\n"; // 可直接访问 public 成员
}
注意:如果把 public Animal 改成 Animal(即省略访问说明符),d.speak() 就会编译失败,因为 Dog 私有继承了 Animal,speak() 在 Dog 作用域里变成 private。
立即学习“C++免费学习笔记(深入)”;
为什么不能只写 class Dog : Animal
这是新手高频踩坑点。C++ 规定:类继承时若不写访问说明符,class 默认是 private,而 struct 默认是 public。所以:
-
class Dog : Animal等价于class Dog : private Animal -
struct Dog : Animal等价于struct Dog : public Animal
但别为了省字符改用 struct —— 语义上 class 更适合表达“具有行为的类型”,且团队代码风格通常统一用 class,显式写 public 更安全、更可读。
继承后要注意的隐性限制
即使是最简单的继承,也有几个容易被忽略的约束:
- 基类析构函数如果不是
virtual,用基类指针 delete 派生类对象会导致未定义行为(虽然这个例子没涉及,但一旦开始用指针就会撞上) - 派生类不能访问基类的
private成员,哪怕在类内也不行;想让子类访问,得用protected -
static成员变量和函数继承时不受访问说明符影响,但调用仍受其自身声明的访问控制限制
真正写业务代码时,“最简单”的继承往往只是起点,后面很快要面对构造顺序、赋值兼容性、切片问题——这些都不是语法写错,而是模型理解偏差导致的运行时问题。


















