Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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++_Qt - Fatal编程技术网

C++ 使用基类的派生类值

C++ 使用基类的派生类值,c++,qt,C++,Qt,试图在基类中创建一个小部件,根据我们调用的派生类,小部件中唯一会改变的就是标题 class BaseView : public QWidget { Q_OBJECT public: explicit BaseView(QWidget *parent = 0); protected: QString title; virtual QString getTitle() const { return title; } BaseVie

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

class BaseView : public QWidget {
    Q_OBJECT
public:
     explicit BaseView(QWidget *parent = 0);
protected:
     QString title; 
     virtual QString getTitle() const {
         return title;
     }
BaseView.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;
     }
在派生构造函数中,我将title设置为“correct”


当我通过创建DerivedView运行程序时,标题仍然是“test”。我怎么做才能从基类调用派生类值?< /p> 除非你对C++有很强的把握,你不能在构造函数< /St>中调用虚函数。问题在于,在创建子对象的过程中,对象的类型是基本子对象,而不是派生对象,因此虚拟函数调用被调度到“错误”函数

婴儿例子:

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.Derived::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")
    { }
};

getTitle
getTopWidgetMessage
之间的关系是什么?也就是说,你将
getTitle
定义为虚拟的,但从不在任何地方调用它——这有什么意义呢?哦,它们应该是相同的。为这个例子重命名了它们,但是忘记了全部重命名。哦,好的。是的,我认为基类不能很容易地从其派生类中获取内容。但是,还有其他的方法吗?标题字符串将相当长,我将在其他对象上执行相同的操作。我想我可能不得不放弃创建所有东西的基类的想法。@chikuba:见我的更新;我将在构造函数中传递所有必需的信息,并在派生构造函数中调用所需的初始值设定项。此外,我注意到您已保存派生视图的构造函数。如果派生视图有一个父视图(另一个小部件),那么该父视图是否也会被发送到baseview?我看不出为什么dervied小部件会是baseview的父级。这是一种常见的做事方式还是我应该想出另一种解决方案?也许heps初始化了派生类中的groupbox同样,你说过我永远不应该调用构造函数中的virtual函数,但我不这么做。那为什么我还有问题?是因为我运行了使用构造函数中变量的函数,而派生的构造函数在完成之前不会被调用吗?