gpt4 book ai didi

C++防止继承基类的特定公共(public)成员

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:17 26 4
gpt4 key购买 nike

如何防止公共(public)成员被其派生类继承?就像,如果我有这个:

class Person {
public:
enum { MALE, FEMALE, BOTH };
Person(std::string name, int gender)
: _name(name)
{
switch (gender) { /* processing here */ }
}
protected:
std::string _name;
};

class Male : public Person {
public:
Male(std::string name)
: _name(name, 0) { }
};

我想这样做的原因是,我希望能够用类似的东西实例化一个 person 类:

Person person("The Name", Person::MALE);

但是,因为 enum 是公开的,这也是可用的:

Male::MALE
Male::FEMALE
Male::BOTH

这已经没有任何意义了。我怎样才能阻止派生类访问这些枚举值,但让基类可以公开访问这些枚举值?

最佳答案

如果您坚持将 enum 保留在基类中,您可以将 enum 放在 protected 部分中。

class Person {
protected:
enum Gender { MALE, FEMALE, BOTH };
Person(std::string name, Gender gender)
: _name(name)
{
switch (gender) { /* processing here */ }
}
std::string _name;
public:
virtual ~Person () {}
//...
};

Person 公开派生的类仍然可以访问 enum 值,但派生类的用户不能。

class Male : public Person {
public:
Male (std::string name) : Person(name, MALE) {}
//...
};

因此,Male 可以使用 MALE,但是 Male 的用户将看不到 Male::MALEMale::FEMALE,也不是 Male::BOTH,这是您的原始问题之一。至于您的问题,您并不是真的想拒绝派生类访问,因为您希望派生类能够指定 Gender。而且你真的不应该允许 Person 的任何直接用户。相反,Person 的用户选择一个正确的派生类,然后它将正确地建立 Gender

class Female : public Person {
public:
Female (std::string name) : Person(name, FEMALE) {}
//...
};

class Transgender : public Person {
public:
Transgender (std::string name) : Person(name, BOTH) {}
//...
};

std::shared_ptr<Person> p = std::make_shared<Female>("Beth");

关于C++防止继承基类的特定公共(public)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30486774/

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