2012-03-27 4 views
1

Kurzgeschichte:machen die Eltern privat und die Großeltern der Öffentlichkeit für eine Klasse

es möglich, zu tun ist,

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

dh „zeigt“, dass C ein A ist und kein B, aber es macht eigentlich ein B ohne das Hinzufügen der virtuellen (und der entsprechenden vptrs)?

Lange Geschichte: A hat mehrere Methoden. B fügt einige mehr hinzu. Manchmal möchte ich die Verwendung von einem von ihnen verbieten. C hat diesen Zweck. Das Programm hat viele B, wenige Cs. Ich möchte dann nicht B zu einer Unterklasse von C. machen

+1

Was ist die Motivation dahinter? Ja, es atleast [kompiliert] (http://codepad.org/JSferQ08), aber was versuchst du zu erreichen? –

+0

Es wäre nett, die Motivation dafür zu hören, aber ich verstehe die downvotes usw. nicht – Novelocrat

+0

Danke @Novelocrat, fügte ich die Motivation hinzu –

Antwort

1

Ja, das wird genau das tun, was Sie vorhaben. Aber eine andere Option in Betracht ziehen: erben öffentlich und versteckt die unerwünschten Methoden:

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) 

Dies wird sowohl mit virtuellen und nicht virtuellen Vererbung arbeiten.

+0

Vielen Dank Ja, aber ich möchte zumindest verhindern, dass void f (B & b) { bb(); } C c; f (c); Ich kann die Möglichkeit des Castings akzeptieren, zumindest weiß der Programmierer, dass es etwas potenziell Gefährliches tut –

Verwandte Themen