C++ C+;中另一个类及其父类的共享类+;
我需要从另一个类(DerivedClass)及其父类(BaseClass)访问某个共享类。以下是我的想法: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
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()代码>