继承与多态3:多态与抽象类
作者:
jokerlove
,
2022-09-06 17:42:56
,
所有人可见
,
阅读 216
class Animal
{
protected:
string _name;
public:
Animal(string name) :_name(name) {}
virtual void bark() = 0;
};
class Cat :public Animal
{
public:
Cat(string name) :Animal(name) {}
void bark() { cout << _name << ":喵喵" << endl; }
};
class Dog :public Animal
{
public:
Dog(string name) :Animal(name) {}
void bark() { cout << _name << ":汪汪" << endl; }
};
class Pig :public Animal
{
public:
Pig(string name) :Animal(name) {}
void bark() { cout << _name << ":哼哼" << endl; }
};
void bark(Cat& cat) { cat.bark(); }
void bark(Dog& dog) { dog.bark(); }
void bark(Pig& pig) { pig.bark(); }
void bark(Animal* p) { p->bark(); }
int main()
{
Cat cat("cat");
Dog dog("dog");
Pig pig("pig");
cout << "======调用类外bark1()======" << endl;
bark(cat);
bark(dog);
bark(pig);
cout << "\n======调用类外bark2()======" << endl;
bark(&cat);
bark(&dog);
bark(&pig);
cout << "\n======调用类内bark()=======" << endl;
Animal* p = &cat;
p->bark();
return 0;
}
需要注意的例子
class Car
{
protected:
string _name;
int _oil;
virtual int getMilesPerOil() = 0;
public:
Car(string name, int oil) :_name(name), _oil(oil) {}
string getName()const { return _name; }
int getMiles()
{
return _oil * getMilesPerOil();
}
};
class Audi :public Car
{
public:
Audi(string name, int oil) :Car(name, oil) {}
int getMilesPerOil() { return 20; }
};
class Bnze :public Car
{
public:
Bnze(string name, int oil) :Car(name, oil) {}
int getMilesPerOil() { return 19; }
};
class BMW :public Car
{
public:
BMW(string name, int oil) :Car(name, oil) {}
int getMilesPerOil() { return 18; }
};
void getInfo(Car& car)
{
cout << car.getName() << " 可用公里数:";
cout << car.getMiles() << endl;
}
int main()
{
Audi a("奥迪", 10);
Bnze b("奔驰", 10);
BMW c("宝马", 10);
getInfo(a);
getInfo(b);
getInfo(c);
return 0;
}