如何防止公共(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("The Name", Person::MALE);
但是,因为 enum
是公共(public)的,所以它也是可用的:
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::MALE
, Male::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/