使用C ++类,您可以让派生类从其父类继承变量。如何定义派生类,以便var2
中不继承derivclass
?
class mainclass{
public:
int var1;
char var2;
void test(){
cout<<var1<<var2<<endl;
}
}
class derivclass : mainclass{
public:
void test(){
cout<<var1<<var2<<endl;
//want a compiler error here that var2 is not defined
}
}
答案 0 :(得分:7)
阻止成员在C ++中继承的规范方法是声明它private
。尝试访问它的派生类将引发编译器错误。它看起来像这样:
class mainclass{
public:
int var1;
void test(){
cout<<var1<<var2<<endl;
}
private:
char var2;
}
class derivclass : mainclass {
public:
void test(){
cout<<var1<<var2<<endl;
//compiler error here; var2 is not accessible
}
}
这是实现您所要求的最直接的方式。
答案 1 :(得分:4)
你可以private
。但你可能不应该这样做。
它不应该从Base继承一些东西这意味着它可能根本不应该直接从Base继承。
而是创建另一个基类,并使这两个类继承自该基类。
class Baseclass{
public:
void test(){
cout<<var1<<endl;
}
protected:
int var1;
}
class mainclass : public Baseclass{
public:
char var2;
void test(){
cout<<var1<<var2<<endl;
}
}
class derivclass : Baseclass{
public:
void test(){
cout<<var1<<endl;
}
}
答案 2 :(得分:2)
正如其他人所说,你可以在基类中将其设为私有,然后在任何子类中都无法访问它。但是,正如@Dave所说,它仍然存在于基类中。如果您甚至不希望它作为隐藏在子类中的变量存在,那么您必须将它从基类中取出。假设某个东西需要变量,那么你必须创建一个包含该变量的新子类。
答案 3 :(得分:0)
派生类继承其基础的每个成员。完全停止。您不能有选择地继承基类的一部分。
将变量设为私有不会阻止继承。变量仍然存在,但在通常情况下它是不可访问的。通过各种友谊游戏,您可以访问它。也许这里的一部分混乱是由Java引起的,其中私有成员不是继承的。也就是说,
struct Base {
private:
int i;
};
struct Derived : Base {
};
Derived d;
d.i = 3; // error: d.i is not accessible
如果未继承i
,则错误是d
没有名为i
的成员。
编辑:另一个,也许更有意义的例子
void f();
class Base {
void f();
};
class Derived : Base {
void g() {
f(); // error: Base::f is not accessible
};
根据Java的规则,对f()
的调用就可以了,并且会调用全局f()
。
答案 4 :(得分:0)
为了响应所有其他答案(并且可能背叛Stochastically),您可以切换主类和派生类,其中新主类将具有您在原始派生类中所需的所有成员值,新派生类(也就是原始主类)中不需要的那些
观察:
class newMainClass{
public:
int var1;
virtual void test(){ //added virtual here so there aren't two definitions for test()
cout<<var1<<var2<<endl;
//want a compiler error here that var2 is not defined
}
}
class newDerivedClass : public newMainClass{
public:
char var2;
void test(){
cout<<var1<<var2<<endl;
}
}