gpt4 book ai didi

c++ - 使代码更小以实现多重继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:47 24 4
gpt4 key购买 nike

我编写了一个非常小的程序,您可以在其中输入您是男孩还是女孩,然后它会打印出一条声明。我的主要问题是,从我的代码中,除了从基类复制和粘贴之外,还有什么更容易为女性编写的方法。这是我的代码

#include <iostream>
#include <string>


class Man{
protected:
std::string name;
public:
void getInfo(std::string hName){
name = hName;
}
void showInfo(){
std::cout << "Your name is: " << name << std::endl;
std::cout << "And you are a MAN" << std::endl;
}
};

class Women{ //is there an easier way to write this
protected:
std::string fem_name;
public:
void getfemInfo(std::string fhName){
fem_name = fhName;
}
void showfemaleInfo(){
std::cout << "Your name is: " << fem_name << std::endl;
std::cout << "And you are a Women" << std::endl;
}
};

class Human:public Man, public Women{
public:
Human(){}
};

int main(){
//local variables
std::string choice;
std::string tName;
//declaring objects
Human person;
//user interface
std::cout << "Please enter you name: ";
std::cin >> tName;
std::cout << "Are you a [boy/girl]: ";
std::cin >> choice;
//if handler
if (choice == "boy"){
person.getInfo(tName);
person.showInfo();
}else if(choice == "girl"){
person.getfemInfo(tName);
person.showfemaleInfo();
}
system("pause");
return 0;
}

当我尝试从类 Man 派生类 Woman 时,它会生成 person.getInfo(tName)person.showInfo () 含糊不清。这是为什么?我怎样才能使这个代码更小(对于女性)。

最佳答案

你搞反了 - 公共(public)继承表示 IS-A 关系。所以你的用法是说“每个人都是男人,每个人都是女人。”那真的行不通。公共(public)继承决不应该被用作“在一个地方获得所有功能”的便利。这就是组合(或者最坏的情况是非公共(public)继承)的用途。

不过,您的情况是使用继承的一个很好的例子。它只需要遵循其自然定义(每个男人都是人;每个女人都是人)。也就是说,使 Human 成为基类并在那里实现所有共享功能。像这样:

class Human
{
protected:
std::string name;

virtual std::string getGenderString() const = 0;

public:
virtual ~Human() {} //dtor must be virtual to be usable as a polymorphic base class

void getInfo(std::string hName)
{ name = hName; }

void showInfo() const
{
std::cout << "Your name is: " << name << '\n';
std::cout << "And you are a " << getGenderString() << std::endl;
}
};


class Man : public Human
{
protected:
virtual std::string getGenderString() const
{ return "MAN"; }
};


class Woman : public Human
{
protected:
virtual std::string getGenderString() const
{ return "WOMAN"; }
};


int main(){
//local variables
std::string choice;
std::string tName;
//declaring objects
Human *person = NULL;
//user interface
std::cout << "Please enter you name: ";
std::cin >> tName;
std::cout << "Are you a [boy/girl]: ";
std::cin >> choice;
//if handler
if (choice == "boy"){
person = new Man();
}else if(choice == "girl"){
person = new Woman();
}
person->getInfo(tName);
person->showInfo();
system("pause");
delete person;
return 0;
}

以上代码使用纯虚函数(必须在派生类中实现)来获取适当的性别字符串。其他一切对两性都是通用的,所以它在基类中。

请注意,有很多好的做法可以添加到代码中,但我不想把这个问题搞得太多。我不知道您是否可以访问 C++11 功能,所以我没有使用任何功能。将上述(工作)代码转换为良好代码的最佳选择是选择 good C++ book。 .

关于c++ - 使代码更小以实现多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21651932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com