大佬教程收集整理的这篇文章主要介绍了C++继承和组合(无师自通),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
123 Main Street
Hometown,12345
class StreetAddress { private: String line1,line2; public: void setLine1(String); void setLine2(String); String getLine1(); String getLine2(); };因为一个人的数据包含一个姓名和一个街道地址,所以正确表示一个人的数据的类将使用以下方式的组合:
class PersonData { private: String name; StreetAddress address; public: ... };
PemmData 的类声明中忽略了其余部分,因为那些与我们要阐述的主旨无关。
在这里可以使用继承而不是组合来定义这个类。例如,可以定义一个类 PersonData1,如下所示:class PersonData1:public StreetAddress { private: String name; public: };虽然这个新的定义能够正确编译,但从概念上讲这其实是错误的,因为它将一个人的数据视为一种特殊的街道地址,而事实并非如此。这种类型的设计概念错误可能会导致程序理解困扰并难以维护。
class Dog { protected: double weight; public: Dog(double w) { weight = w; } virtual void bark() const { cout << "I am dog weighing " << weight << " pounds." << endl; } };这个类还有一个构造函数,允许 Dog 对象被初始化。请注意,以上示例中已经声明了一个虚成员函数 bark(),以允许它在派生类中被覆盖。
class SheepDog:public Dog { private: int numberSheep; public: SheepDog(double w,int nSheep) : Dog(w) { numberSheep = nSheep; } virtual void bark() const override { cout << "I am a sheepdog weighing " << weight << " pounds \nand guarding " << numberSheep << " sheep." << endl; } };为了演示该类,可以建立一个狗的矢量,矢量中的一些狗就是牧羊犬。为了规避矢量不能拥有两种不同类型的事实,可以使用指向 Dog 的指针的矢量。前面讲过,一个指向基类(在本示例中即 Dog 类)的指针也可以指向任何派生类对象(在本示例中为 SheepDog)。因此,可以创建一个指向 Dog 的指针矢量,并且其中一些指针指向 Dog 对象,而另一些指针则指向 SheepDog 对象。
vector<shared_ptr<Dog>> kenne1 { make_shared<Dog>(40.5),make_shared<SheepDog>(45.3,50),make_shared<Dog>(24.7) };最后,可以使用一个循环来调用矢量中每个 Dog 对象的 bark() 成员函数:
for (int k = 0; k < 3; k++) { cout << k+1 << ": "; kennel[k]->bark(); }由于多态性,并且因为 bark() 函数被声明为虚函数,所以循环内的同一行代码对普通狗将调用原始的 bark() 函数,而对牧羊犬则会调用派生类 SheepDog 中的特殊 bark() 函数。完整的程序为:
// This program demonstrates the Is-A relation in inheritance. #include <iostream> #include <memory> #include <vector> using namespace std; // Base class class Dog { protected: double weight; public: Dog(double w) { weight = w; } virtual void bark() const { cout << "I am a dog weighing " << weight << " pounds." << endl; } }; // A SheepDog is a special type of Dog class SheepDog :public Dog { int numberSheep; public: SheepDog(double w,int nSheep) : Dog(w) { numberSheep = nSheep; } void bark() const override { cout << "I am a sheepdog weighing " << weight << " pounds and guarding " << numberSheep << " sheep." << endl; } }; int main() { // Create a vector of dogs vector<shared_ptr<Dog>> kennel { make_shared<Dog>(40.5),make_shared<Dog>(24.7) }; // Walk by each kennel and make the dog bark for (int k = 0; k < kennel.size(); k++) { cout << k + 1 << ": "; kennel[k]->bark(); } return 0; }程序输出结果:
1: I am a dog weighing 40.5 pounds.
2: I am a sheepdog weighing 45.3 pounds and guarding 50 sheep.
3: I am a dog weighing 24.7 pounds.
以上是大佬教程为你收集整理的C++继承和组合(无师自通)全部内容,希望文章能够帮你解决C++继承和组合(无师自通)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。