-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
#include <iostream>
class Animal {
public:
virtual void speak() {
std::cout << "Animal speak" << std::endl;
}
protected:
std::string name;
int age;
};
// virtual 解决菱形继承, B -> A, C -> A, D -> B&C, 使D只保留一份A
class Dog: public /*virtual*/ Animal {
// 友元 该函数内可以访问私有变量
friend void printDogInfo(Dog &dog);
public:
// 构造函数
Dog() {
std::cout << "默认构造函数" << std::endl;
name = "unknown";
age = 0;
}
Dog(std::string name, int age = 0) {
std::cout << "有参构造函数" << std::endl;
this -> name = name;
this -> age = age;
}
void speak() {
std::cout << "Dog speak" << std::endl;
}
~Dog() {
std::cout << "析构函数: " << name << std::endl;
}
};
void printDogInfo(Dog &dog) {
std::cout << "name: " << dog.name << " age: " << dog.age << std::endl;
}
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
Dog dog;
dog.speak();
printDogInfo(dog);
{
Animal *dog2 = new Dog("二哈");
// 这里期望调用Dog的speak,所以Animal内的speak需要使用虚函数
dog2 -> speak();
delete dog2;
}
return 0;
}
Metadata
Metadata
Assignees
Labels
No labels