我需要从另一个类(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的功能。你有什么想法吗?
答案 0 :(得分:4)
关键字virtual
用于允许派生类提供自己的给定函数实现。
您正在寻找数据的基本继承。始终完成此操作,并使用可见性修饰符控制访问。您使用了public:
(对所有人都可见),但也有proctected:
(仅对类及其子类可见)和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();
}
};
请注意,当变量是公共的时,这将起作用,但最好尽可能地限制范围,因此受保护在这里更为可靠。
答案 1 :(得分:2)
SharedClass * sharedClass;在具有公共可见性的基类中,足以从Base类和Derived
调用Shared类方法