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

标签 c++ inheritance polymorphism

如何防止公共(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::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/

相关文章:

c++ - 找不到 <torch/extension.h>

python - 如何正确处理Python继承

Java,数组值的getter(数组动态定义)

scala - 如何防止编译器选择最少泛型类型?

c++ - 遇到无效写入问题

C++ boost lambda 库

c++ - Boost 或 C++11 中是否有一个容器充当队列但具有独特的元素?

javascript - Ext 继承 - 无法从基类/抽象类获取静态值

Java - 具有集合属性的多态性

c++ - 删除指向派生类的指针时指定给 RtlValidateHeap 的地址无效