9

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

5 回答 5

8

防止成员在 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
    }
}

这是实现您所要求的最直接的方法。

于 2013-04-17T18:32:37.090 回答
5

你可以做到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;
    }
}
于 2013-04-17T18:32:41.870 回答
2

正如其他人所说,您可以在基类中将其设为私有,然后在任何子类中都无法访问它。但是,正如@Dave 所说,它仍然存在于基类中。如果您甚至不希望它作为对子类隐藏的变量存在,那么您必须将其从基类中取出。假设某个变量需要某个变量,那么您必须创建一个包含该变量的新子类。

于 2013-04-17T18:36:11.153 回答
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 的规则,调用 tof()是可以的,并且会调用 global f()

于 2013-04-17T19:25:39.557 回答
0

作为对所有其他答案的回应(并且可能捎带随机),您可以切换主类和派生类,其中新的主类将具有您在原始派生类中想要的所有成员值,将不需要的那些放入新的派生类(又名原来的主类)

观察:

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;
    }
}
于 2016-08-01T23:07:40.837 回答