如何在C ++类中继承变量

时间:2013-04-17 18:24:30

标签: c++ inheritance

使用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
    }
}

5 个答案:

答案 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;
    }
}