Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+;中另一个类及其父类的共享类+;_C++ - Fatal编程技术网

C++ C+;中另一个类及其父类的共享类+;

C++ C+;中另一个类及其父类的共享类+;,c++,C++,我需要从另一个类(DerivedClass)及其父类(BaseClass)访问某个共享类。以下是我的想法: class BaseClass { public: virtual SharedClass *sharedClass; // Error! Virtual cannot use for non-static vars void callFromBaseClass() { sharedClass.testFunc(); // I need a

我需要从另一个类(DerivedClass)及其父类(BaseClass)访问某个共享类。以下是我的想法:

class BaseClass {
public:
    virtual SharedClass *sharedClass; // Error! Virtual cannot use for non-static vars
    void callFromBaseClass() {
        sharedClass.testFunc(); 
        // I need an access to sharedClass here too as well as in the DerivedClass
    }
};

class DerivedClass : public BaseClass {
public:
    SharedClass *sharedClass;
    DerivedClass( SharedClass *sharedClass ) {
        this->sharedClass = sharedClass;
    }
    void callFromDerivedClass() {
        sharedClass.testFunc();
    }
};
使用它:

SharedClass sharedClass;
DerivedClass derivedClass( &sharedClass );
我想我可以使用virtual作为指向类的指针,但我在那里遇到了错误:“virtual”只能出现在非静态成员函数上。
所以我不知道如何访问sharedClass的函数。你有什么想法吗?

SharedClass*SharedClass;在具有公共可见性的基类中,足以从基类和派生类调用共享类方法

关键字
virtual
用于允许派生类提供其自己的给定函数实现

您正在寻找数据的基本继承。这是始终完成的,访问由可见性修改器控制。您使用了
public:
(对每个人都可见),但也有
protected:
(仅对类及其子类可见)和
private:

如果一个类中的任何普通变量在另一个类中可见,则该类中的任何普通变量都可以被其他类使用。在另一个类中,不应重复对象声明(因为它将通过使用相同的名称隐藏您正在查找的对象)

因此,在您的情况下,如果从
DerivedClass
类中删除声明,您将能够在
BaseClass
中使用该声明

结果如下:

class BaseClass {
protected:
    SharedClass *sharedClass; // No virtual
public:
    BaseClass( SharedClass *sharedClass ) {
        this->sharedClass = sharedClass;
    }
    void callFromBaseClass() {
        sharedClass->testFunc(); 
        // I need an access to sharedClass here too as well as in the DerivedClass
    }
};

class DerivedClass : public BaseClass {
public:
    // No declaration of sharedClass
    DerivedClass( SharedClass *sharedClass )
          :BaseClass(sharedClass)   // Pass the shared class to the base class.
    {

    }
    void callFromDerivedClass() {
        // Shared class is visible here because it is in the base class with visibility protected.
        sharedClass->testFunc();
    }
};

请注意,当变量是公共变量时,这将起作用,但最好尽可能地限制作用域,这样受保护的在这里更适合使用。

您的意思是,如果我删除“virtual”关键字,则基类中的sharedClass在基类中没有初始化的情况下不会为NULL?我认为callFromBaseClass()将失败,因为sharedClass指向NULL。首先,在代码中有一些地方:Shared*obj=new sharedClass();然后您可以调用新的DerivedClass(obj)。。。在派生构造函数中,指定此->sharedClass=sharedClass;您必须删除派生中的SharedClass*SharedClass声明,因为您已经在BaseClass
SharedClass.testFunc()中声明了它。testFunc()应该是
SharedClass->testFunc()