我在c ++中了解继承,并尝试实现基本设置 基类有a)抽象方法fire(),子类必须实现,b)变量 哪个子类继承。
我的设置按预期工作,但只有在我使用它之前立即创建对象时(参见"选项1和#34;下面)。 当我在其他地方创建对象时(参见"选项2和#34;)(* p).getSomeDouble()调用似乎会导致问题。
所以我的问题是,这是正确的整体方法吗?如果是这样,我如何得到"选项2"工作?
编辑:感谢关于范围的评论,好的观点,但这并没有真正回答我关于我的整体方法是否正确以及如何在其他地方正确创建对象的问题传递它(即如何让它实际工作)。
class BaseClass{
public:
virtual void fire() = 0;
// Use a getter and setter as you can't make a variable virtual in c++
virtual double getSomeDouble(){ return someDouble; }
virtual void setSomeDouble(double d){ someDouble = d; }
private:
double someDouble;
};
class DerivedClass : public BaseClass{
public:
void fire();
};
class AnotherClass{
public:
// Set up a DerivedClass object and set someDouble to 1
BaseClass * getDerivedObject(){
DerivedClass object;
object.setSomeDouble(1);
BaseClass * p = &object;
return p;
};
};
void DerivedClass::fire(){ cout << "Derived class fired. Yay." << endl; }
int main()
{
// Option 1 - set up object here. Everything works fine.
/*DerivedClass object;
object.setSomeDouble(1);
BaseClass * p = &object;*/
// Option 2 - set up object in AnotherClass
AnotherClass a;
BaseClass * p = a.getDerivedObject(); // at this point, p looks fine in my IDE (someDouble = 1)
cout << to_string( (*p).getSomeDouble() ); // with option 2, this prints a nonsense value (and the data my IDE returns for *p has changed)
(*p).fire(); // with option 2, this fails with " Access violation reading location 0xCCCCCCCC."
return 0;
}