Сделав родителя частным и прародителя публичным для класса - PullRequest
1 голос
/ 27 марта 2012

Рассказ:

можно ли сделать

class A{};
class B:public virtual A{}; 
class C:public virtual A,private B{};

т.е. «показывая», что C - это A, а не B, но делая его фактически B без добавления виртуального (и соответствующего vptrs)?

Длинная история: А имеет несколько методов. Б добавляет еще немного. Иногда я хочу запретить использование одного из них. С имеет эту цель. В программе много B, мало Cs. Я не хочу тогда делать B подклассом C.

1 Ответ

1 голос
/ 28 марта 2012

Да, это будет делать именно то, что вы собираетесь делать.Но рассмотрим другой вариант: публичное наследование и скрытие нежелательных методов:

class A
{
public:
    int a() {return 0xaa;}
};

class B: public A
{
public:
    int b() {return 0xbb;}
};

class C: public B
{
private:
    using B::b; // makes the method called b private
};

...
B().b(); // OK, using method b in class B
C().b(); // error: b is private in class C
C().B::b(); // OK: calling b in base-class (not sure if you want to prevent this)

Это будет работать как с виртуальным, так и с не виртуальным наследованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...