gpt4 book ai didi

c++ - 使用基类的派生类值

转载 作者:行者123 更新时间:2023-11-30 04:29:45 28 4
gpt4 key购买 nike

尝试在基类中创建一个小部件,根据我们调用的派生类,小部件中唯一会发生变化的是标题。

class BaseView : public QWidget {
Q_OBJECT
public:
explicit BaseView(QWidget *parent = 0);
protected:
QString title;
virtual QString getTitle() const {
return title;
}

基础 View .cpp:

BaseView::BaseView(QWidget *parent) : QWidget(parent) {

title = "test"
}

void BaseView::createTopWidget() {
QGroupBox *topWidget = new QGroupBox(getTitle());
....
}

派生类头中的:

class DerivedView : public BaseView {
Q_OBJECT
public:
explicit DerivedView(QWidget *parent = 0);
protected:
QString getTitle() const {
return title;
}

在派生的构造函数中,我将标题设置为“正确”。

当我通过创建 DerivedView 运行程序时,标题仍然是“测试”。我该怎么做才能调用并从基类获取派生类值?

最佳答案

除非您对 C++ 有非常扎实的掌握,否则您不得在构造函数中调用虚函数。问题在于,在创建子对象期间,对象的类型是基础子对象,而不是派生对象,因此虚函数调用被分派(dispatch)到“错误的”函数。

宝贝例子:

struct Base
{
virtual int foo() { return 8; }

Base() { set_something(foo()); } // who're you gonna call?
};
struct Derived
{
virtual int foo() { return -12; }
};

Derived d;

现在在 d.Base() 的基础构造函数中,被调用的函数是 d.Base::foo(),而不是 d。派生::foo().

而且,基类构造函数运行时,成员变量title只是被设置为"test",还没有被派生构造函数中的赋值,它仅在 基本构造函数完成后运行。

您可以通过在构造函数中显式传递标题来解决您的问题:

class BaseView : public QWidget
{
public:
BaseView(QWidget * parent = 0, QString const & t = "test")
: QWidget(parent), title(t)
{
something.set_title(title);
}

// ...
};

class DerivedView
{
public:
DerivedView(QWidget * parent = 0)
: BaseView(parent, "correct")
{ }
};

关于c++ - 使用基类的派生类值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9121127/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com