C++继承是面向对象编程的核心特性之一,它允许一个类(派生类)继承另一个类(基类)的属性和方法。继承实现了代码重用,并支持"是一个"的关系(is-a relationship)。
问题描述:
class A {
public:
int data;
};
class B : public A {};
class C : public A {};
class D : public B, public C {};
当创建D类对象时,它会包含两份A的副本,导致访问data成员时出现二义性。
解决方案:使用虚继承
class A {
public:
int data;
};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};
问题描述:
class Base {
public:
void func(int x) { /*...*/ }
};
class Derived : public Base {
public:
void func() { /*...*/ } // 隐藏了Base::func(int)
};
Derived d;
d.func(5); // 错误,Base::func(int)被隐藏
解决方案:
class Derived : public Base {
public:
using Base::func; // 引入基类函数
void func() { /*...*/ }
};
问题:不清楚基类和派生类的构造/析构顺序
规则:
问题描述:
class Base { /*...*/ };
class Derived : public Base { /*...*/ };
Derived d;
Base b = d; // 切片发生,Derived特有部分丢失
解决方案:使用指针或引用
Base& b = d; // 保持多态性
#include <iostream>
// 基类
class Animal {
public:
Animal(const std::string& name) : name(name) {}
virtual ~Animal() = default;
virtual void speak() const {
std::cout << name << " makes a sound." << std::endl;
}
protected:
std::string name;
};
// 派生类
class Dog : public Animal {
public:
Dog(const std::string& name) : Animal(name) {}
void speak() const override {
std::cout << name << " says Woof!" << std::endl;
}
void fetch() {
std::cout << name << " fetches the ball." << std::endl;
}
};
int main() {
Animal* animal = new Dog("Buddy");
animal->speak(); // 多态调用
// 向下转型
if (Dog* dog = dynamic_cast<Dog*>(animal)) {
dog->fetch();
}
delete animal;
return 0;
}
这个示例展示了继承、多态和类型转换的基本用法。
没有搜到相关的文章