首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在不出错的情况下创建qtreeview的派生类:未定义对` `vtable for RoomTree‘的引用

在不出错的情况下创建QTreeView的派生类,需要注意以下几点:

  1. 引用正确的头文件:确保在派生类的头文件中正确引用了QTreeView类的头文件,即#include <QTreeView>
  2. 继承QTreeView类:在派生类的声明中使用关键字class,并在冒号后面指定继承自QTreeView类,例如class RoomTree : public QTreeView
  3. 实现构造函数:在派生类的实现文件中,实现派生类的构造函数。在构造函数中,可以进行一些初始化操作,例如设置视图的样式、设置模型等。例如:
代码语言:txt
复制
RoomTree::RoomTree(QWidget *parent) : QTreeView(parent)
{
    // 进行初始化操作
    // ...
}
  1. 实现虚函数:如果需要在派生类中重写QTreeView的虚函数,可以在派生类中实现这些函数。例如,如果需要重写paintEvent函数来自定义绘制行为,可以在派生类中添加如下代码:
代码语言:txt
复制
void RoomTree::paintEvent(QPaintEvent *event)
{
    // 自定义绘制行为
    // ...
    QTreeView::paintEvent(event); // 调用基类的绘制函数
}
  1. 编译和链接:确保将派生类的头文件和实现文件正确地包含到项目中,并进行编译和链接。

总结起来,创建QTreeView的派生类的步骤包括引用正确的头文件、继承QTreeView类、实现构造函数和虚函数(如果需要),以及进行编译和链接。在创建派生类的过程中,需要注意避免语法错误和逻辑错误,以确保不出错地创建QTreeView的派生类。

关于QTreeView的更多信息,可以参考腾讯云的相关文档和示例代码:

请注意,以上答案仅供参考,具体实现可能因项目需求和环境而异。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?

2、在遇到通过基类指针或引用调用虚函数语句时,首先根据指针或引用静态类型来判断所调函数是否属于该class或者它某个public 基类,如果 属于再进行调用语句改写: (*(p->_vptr[slotNum...如果不属于,则直接调用指针或引用静态类型对应函数,如果此函数不存在,则编译出错。...我们常用编译器,vc++、g++等都是用尾部追加成员方式实现继承(前置基类实现方式),在最好情况下可以做到指针不偏移;另一些编译器(比如适用于某些嵌入式设备编译器)是采用后置基类实现方式...也是论坛上经常讨论,也就是说delete 基类指针(在指针没有偏离情况下) 会不会造成内存泄漏问题,上面说到如果此时基类析构函数为虚函数,那么是不会内存泄漏,如果不是则行为未定义。...如果将B 析构函数virtual 关键字去掉,那么B与D大小不一致,而且此时pb 已经偏移,delete pb; 先调用~B(),然后free 出错 *** glibc detected ***

92600

抽象类为什么不能被实例化?

它建立一个基本格式,用来确定什么是对于所有派生类是公共——除此之外,别无用途。抽象基类仅仅表示接口,表示特例实现,因此,实例化一个抽象类对象,总是没有意义。...VTABLE,即虚表,其中会填写好每个虚函数地址:如果派生类覆写(override)了某个虚函数,那么该虚函数所占据表项将填为派生类覆写虚函数地址。否则,该表项填写基类该虚函数地址。...通过这样机制,可以保证以指针或引用方式(即地址)访问派生类对象时,总是会通过vptr所指向虚表中某个特定索引位置上函数地址,调用实际指针或引用所指派生类对象定义虚函数实现。...其中,”填写“这个动作,实际上是编译器来完成,当构建派生类对象时(即构造函数),编译器会在VTABLE中放置特定类虚函数地址。...因此,只要有一个函数在类中被声明为纯虚函数,则VTABLE就是不完全。 如果一个类VTABLE是不完全,当某人试图创建这个类对象时,编译器做什么呢?它不能安全地创建一个纯抽象类对象。

45320

虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?

2、在遇到通过基类指针或引用调用虚函数语句时,首先根据指针或引用静态类型来判断所调函数是否属于该class或者它某个public 基类,如果 属于再进行调用语句改写: (*(p->_vptr[slotNum...如果不属于,则直接调用指针或引用静态类型对应函数,如果此函数不存在,则编译出错。...我们常用编译器,vc++、g++等都是用尾部追加成员方式实现继承(前置基类实现方式),在最好情况下可以做到指针不偏移;另一些编译器(比如适用于某些嵌入式设备编译器)是采用后置基类实现方式...也是论坛上经常讨论,也就是说delete 基类指针(在指针没有偏离情况下) 会不会造成内存泄漏问题,上面说到如果此时基类析构函数为虚函数,那么是不会内存泄漏,如果不是则行为未定义。...如果将B 析构函数virtual 关键字去掉,那么B与D大小不一致,而且此时pb 已经偏移,delete pb; 先调用~B(),然后free 出错 *** glibc detected ***

97720

C++面试题

6、静态方法不能被重写为非静态方法(会编译出错)。 重载规则: 1、在使用重载时只能通过相同方法名、不同参数形式实现。...虚函数作用在于通过父类指针或者引用来调用它时候能够变成调用子类那个成员函数。而构造函数是在创建对象时自动调用,不可能通过父类指针或者引用去调用,因此也就规定构造函数不能是虚函数。...当编译器为这个构造函数产生代码时,它是为这个类构造函数产生代码——既不是为基类,也不是为它派生类(因为类不知道谁继承它)。所以它使用VPTR必须是对于这个类VTABLE。...2) type_info类里面的比较运算符 3) dynamic_cast运算符,该运算符将基类指针或引用安全地转换为派生类类型指针或引用。 9....如何在共享内存上使用STL标准库?

1.7K42

【C++】三大特性之多态

那么在继承中要 构成多态还有两个条件: 必须通过基类指针或者引用调用虚函数 被调用函数必须是虚函数,且派生类必须基类虚函数进行重写 2.虚函数 我们在讲继承菱形继承时候曾经说到过虚拟继承...  virtual 关键字时,虽然也可以构成重写 ( 因为继承后基类虚函数被继承下来了在派生类依旧保持虚函数属性), 但是该种写法不是很规范,建议这样使用 虚函数重写两个例外:...协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象指 针或者引用派生类虚函数返回派生类对象指针或者引用时,称为协变。...这里父子类指针或引用甚至还可以是其他父子类指针或引用。...4.C++11 override 和 fifinal 从上面可以看出, C++ 函数重写要求比较严格,但是有些情况下由于疏忽,可能会导致函数 名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出

72150

【C++】从零开始认识多态

多态构成条件: 必须通过基类指针或者引用调用虚函数(virtual修饰类成员函数) 被调用函数必须是虚函数,且派生类必须基类虚函数进行重写(父子虚函数要求三同) 虚函数重写(覆盖):派生类中有一个跟基类完全相同虚函数...协变:派生类重写基类虚函数时,与基类虚函数返回值类型不同: 基类虚函数返回基类对象指针或者引用 派生类虚函数返回派生类对象指针或者引用 这样情况称为协变。...那我们来看看现在满不满足多态条件: 必须通过基类指针或者引用调用虚函数(virtual修饰类成员函数) 被调用函数必须是虚函数,且派生类必须基类虚函数进行重写(父子虚函数要求三同) 在编译时候...应该释放空间全都释放了!!! 所以建议析构函数设置为虚函数,避免出现上述情况。 3.3 语法细节 派生类(基类必须写)对应函数可以写virtual(这个语法点非常奇怪!...会有生命危险(Doge) 3.4 C++11 override 和 final 从上面可以看出,C++函数重写要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出

7510

C++从入门到精通(第九篇) :多态

Person对象买票全价,Student对象买票半价 那么在继承中要构成多态还有两个条件: 必须通过基类指针或者引用调用虚函数 被调用函数必须是虚函数,且派生类必须基类虚函数进行重写 运行结果...virtual关键字时,虽然也可以构成重写(因为继 承后基类虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,建议这样使用 */ /*void BuyTicket() { cout...即基类虚函数返回基类对象指针或者引 用,派生类虚函数返回派生类对象指针或者引用时,称为协变。...) //再进行解引用拿到虚函数表指针,然而这样子无法进行传参(类型匹配),要强转为虚函数指针数组类型 PrintVTable(vTableb1); VFPTR* vTableb2...抽象类更好表现了现实生活中抽象事物,植物,人等本不具有实例名称。 ps 想和博主一样刷优质面试和算法题嘛,快来刷题面试神器牛客吧,期待与你在牛客相见

44130

轻松搞定面试中“虚”

虚函数作用是允许在派生类中重新定义与基类同名函数,并且可以通过基类指针或引用来访问基类和派生类同名函数,达到多态目的。 2.什么是纯虚函数,什么是纯虚类,有什么作用?...虚拟继承与普通继承不同是,虚拟继承可以防止出现diamond继承时,一个派生类中同时出现了两个基类子对象。也就是说,为了保证这一点,在虚拟继承情况下,基类子对象布局是不同于普通继承。...为实现动态联编,编译器为每个包含虚函数创建一个表,称为vtable,在vtable中,编译器放置了特定类虚函数地址,在每个带有虚函数类中编译器会秘密地设置一个虚函数表指针,称为vptr,指向对象...动态联编是指在程序执行时候才将函数实现和函数调用关联,因此也叫运行时绑定或者晚绑定,动态联编函数选择不是基于指针或者引用,而是基于对象类型,不同对象类型将做出不同编译结果。...c++通过下面两个操作符提供RTTI: (1)typeid:返回指针或引用所指对象实际类型。 (2)dynamic_cast:将基类类型指针或引用安全转换为派生类指针或引用

66020

【c++】多态&&虚函数&&抽象类&&继承中虚函数表详解

那么在继承中要构成多态还有两个条件: 必须通过基类指针或者引用调用虚函数 被调用函数必须是虚函数,且派生类必须基类虚函数进行重写 2.2 虚函数 虚函数:即被virtual修饰类成员函数称为虚函数...virtual关键字时,虽然也可以构成重写(因 为继承后基类虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,建议 这样使用*/ /*void BuyTicket() {...即基类虚函数返回基类对象指针或者引用派生类虚函数返回派生类对象指针或者引用时,称为协变。...,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出,只有在程序运行时没有得到预期结果才来debug会得不偿失,因此:C++11提供了override和...5.3 菱形继承、菱形虚拟继承 实际中我们建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样模型,访问基类成员有一定得性能损耗。

32410

【C++深度探索】全面解析多态性机制(二)

,发现只有一个int类型成员变量_b,所以应该是4个字节,但是我们可以看一下结果: 这里显示是8字节,这是因为Base类中创建了虚函数,而每个包含虚函数类都有一个对应虚函数表,虚函数地址要被放到虚函数表中...虚函数地址存放在虚函数表中,而对象中前四个字节存放是虚函数表指针,所以我们可以使用强制类型转换取出对象前四个字节,但是int类型与Base和Derive类型兼容,不能相互转换,但是指针之间可以相互转换...,所以我们考虑先取Base和Derive类对象地址然后强制转换成int*类型,然后再解引用就得到了虚函数表地址 代码如下: //情况二:基类和派生类中都有虚函数,并且虚函数没有被重写 //基类和派生类代码如上...如下图所示: 情况三:基类中定义虚函数,并且派生类该虚函数进行了重写 例如: //情况三:基类中定义虚函数,并且派生类该虚函数进行了重写 class Base { public: virtual...func3()放在第一个继承基类部分虚函数表中,图示如下: 5.结语 虚函数表存在是为了实现动态绑定也就是实现多态,当派生类基类虚函数进行重写时,通过基类对象指针和引用调用虚函数时,就会通过虚函数表来确定不同对象调用不同函数

1800

【C++航海王:追寻罗杰编程之路】多态你了解多少?

那么在继承中要构成多态还有两个条件: 必须通过基类指针或者引用调用虚函数。 被调用函数必须是虚函数,且派生类必须基类虚函数进行重写。...virtual关键字时,虽然也可以构成重写(因 为继承后基类虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,建议 这样使用*/ /*void BuyTicket() {...协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类函数返回值类型不同。即基类虚函数返回基类对象指针或引用派生类虚函数返回派生类对象指针或引用时,称为协变。...看起来违背了重写规则,其实不然,这里可以理解为编译器析构函数名称做了特殊处理,编译后析构函数名称统一处理成destructor。...,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出,只有在程序运行时没有得到预期结果才来debug会得不偿失。

7610

C++进阶-多态

,且派生类必须基类虚函数进行重写 示图: 二、虚函数 1、概念和定义 虚函数语法: 被virtual修饰类成员函数称为虚函数 示例: class Person { public:...协变 类虚函数返回基类对象指针或者引用派生类虚函数返回派生类对象指针或者引用时,称为协变(基类与派生类虚函数返回值类型不同) 示例: class A {}; class B : public...如果基类虚函数不加virtual,派生类虚函数加virtual,这种情况是构成虚函数 析构函数重写 我们知道,基类指针和引用可以指向基类和派生对象,由此通过指针和引用释放对象时需要实现析构多态...,但基类与派生类析构函数名字不同 为了解决,编译器析构函数名称做了特殊处理,编译后析构函数名称统一处理成destructor 示例: class Person { public: virtual...虚函数表是在编译阶段(对象构造时)就生成,一般情况下存在代码段(常量区) C++菱形继承问题?虚继承原理?

57930

多态与虚(函数)表

那么在继承中要构成多态还有两个条件: 必须通过基类指针或者引用调用虚函数 被调用函数必须是虚函数,且派生类必须基类虚函数进行重写 1. 2️⃣虚函数 虚函数:即被virtual修饰类成员函数称为虚函数...virtual关键字时,虽然也可以构成重写(因 为继承后基类虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,建议 这样使用*/ /*void BuyTicket() { cout...协变(基类与派生类虚函数返回值类型不同) 派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象指 针或者引用派生类虚函数返回派生类对象指针或者引用时,称为协变。...虽然函数名不相同,看起来违背了重写规则,其实不然,这里可以理解为编译器析构函数名称做了特殊处理,编译后析构函数名称统一处理成destructor。...,但是有些情况下由于疏忽,可能会导致函数 名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出,只有在程序运行时没有 得到预期结果才来debug会得不偿失,因此:C++11提供了override

56320

动态联编实现原理分析

(3)虚函数表是一个类对象共享,还是一个对象就拥有一个虚函数表? (4)多重继承情况下派生类有多少个虚函数表呢?...两种方法都是利用了某种机制逃避C++类型转换检测,为什么C++编译器干脆直接放开这个限制,一切让程序员自己作主呢?当然是有原因,因为类成员函数和普通函数还是有区别的,允许转换后,很容易出错。...因此,在程序中使用了宏ShowFuncAddress,利用内联汇编来获取类非静态成员函数入口地址。这是一个带参数宏,并且参数做了一些特殊处理,字符串化处理。...(4)多重继承情况下派生类有多少个虚函数表呢?...f4@Derived@@UAEXXZ CONST ENDS 这里说明一下如何在VS2012中生成汇编代码文件。

42420

C++动态联编实现原理分析

(3)虚函数表是一个类对象共享,还是一个对象就拥有一个虚函数表? (4)多重继承情况下派生类有多少个虚函数表呢?...两种方法都是利用了某种机制逃避C++类型转换检测,为什么C++编译器干脆直接放开这个限制,一切让程序员自己作主呢?当然是有原因,因为类成员函数和普通函数还是有区别的,允许转换后,很容易出错。...因此,在程序中使用了宏ShowFuncAddress,利用内联汇编来获取类非静态成员函数入口地址。这是一个带参数宏,并且参数做了一些特殊处理,字符串化处理。...(4)多重继承情况下派生类有多少个虚函数表呢? 子类如果继承了多个父类,并重写了继承而来虚函数,那么子类实例内存布局如下图所示: ? 我们可以看见,子类有多少个父类,就有多少个虚函数表。...f4@Derived@@UAEXXZ CONST ENDS 这里说明一下如何在VS2017中生成汇编代码文件。

1.6K30

C++之多态

在继承种构成多态要满足两个条件: 必须通过基类指针或者引用调用虚函数(该指针或者引用操作派生类种基类那一部分内容) 被调用函数必须是虚函数,且派生类必须虚函数进行重写。...即基类虚函数返回基类对象指针或者引用派生类虚函数返回派生类对象指针或者引用时(返回值类型为继承关系指针),称为协变。...析构函数: 如果基类析构函数定义为虚函数,则派生类析构函数无论是否加virtual关键字都与基类析构函数构成重写,这里可以理解为编译器析构函数进行特殊处理将析构函数函数名统一处理为destuctor...和final关键字 C++函数重写要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重写,而这种错误在编译期间是不会报出,只有在程序运行时没有得到预期结果才来debug会得不偿失...最后,如果本篇文章你有所启发的话,希望可以多多支持作者,谢谢大家!

33540

【c++】全面理解C++多态:虚函数表深度剖析与实践应用

Person对象买票全价,Student对象买票半价 那么在继承中要构成多态还有两个条件: 必须通过基类指针或者引用调用虚函数 被调用函数必须是虚函数,且派生类必须基类虚函数进行重写 指向谁调用谁...即基类虚函数返回基类对象指针或者引用派生类虚函数返回派生类对象指针或者引用时,称为协变。...C++函数重写要求比较严格,但是有些情况下由于疏忽,可能会导致函数名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出,只有在程序运行时没有得到预期结果才来debug会得不偿失,因此:C...基类中虚函数定义了一个接口,而派生类通过覆盖这个虚函数,提供了这个接口特定实现 当创建派生类 B 实例,并通过它调用 test() 时,过程如下: test() 是在基类 A 中定义,因此它会调用...然而,在虚继承情况下,共享基类(在该例子中是 A)只会被初始化一次,而且是由最底层派生类(D)来初始化。

17900

C++纯虚函数 virtual =0

派生类有自己VTABLE,但是派生类VTABLE与基类VTABLE有相同函数排列顺序,同名虚函数被放在两个数组相同位置上。...在创建类实例时候,编译器还会在每个实例内存布局中增加一个vptr字段,该字段指向本类VTABLE。...a) {     (a->vptr[1])(); }     因为派生类和基类foo()函数具有相同VTABLE索引,而他们vptr又指向不同VTABLE,因此通过这样方法可以在运行时刻决定调用哪个...};     这种情况下,B::foo()是虚函数,C::foo()也同样是虚函数。因此,可以说,基类声明虚函数,在派生类中也是虚函数,即使不再使用virtual关键字。...cast回到它原来类型(派生类),而是希望他们进行同样操作。

1.5K40

深入浅出C++虚函数vptr与vtable

此表中每个条目只是一个函数指针,指向该类可访问最派生函数。 其次,编译器还会添加一个隐藏指向基类指针,我们称之为vptr。vptr在创建类实例时自动设置,以便指向该类虚拟表。...与this指针不同,this指针实际上是编译器用来解析自引用函数参数,vptr是一个真正指针。 因此,它使每个类对象分配大一个指针大小。这也意味着vptr由派生类继承,这很重要。...Base &pp = ptr; // 基类引用指向基类实例 Base &p = d; // 基类引用指向派生类实例 cout<<"基类对象直接调用"<<endl; ptr.fun1...除此之外,上述代码大家会看到,也包含了手动获取vptr地址,并调用vtable函数,那么我们一起来验证一下上述地址与真正在自动调用vtable虚函数,比如上述pt->fun1()时候,是否一致...通过gdb vptr进入gdb调试页面,然后输入b Derived::fun1fun1打断点,然后通过输入r运行程序到断点处,此时我们需要查看调用栈中内存地址,通过disassemable fun1

4K30

什么是多态?如何实现?只看这一篇就够了

那么在继承中要构成多态还有两个条件: 必须通过基类指针或者引用调用虚函数 被调用函数必须是虚函数,且派生类必须基类虚函数进行重写 ?...virtual 关键字时,虽然也可以构成重写(因为继承后基类虚函数被继承 下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范, 建议这样使用*/ /*void...即基类虚函数返回基类对象指针或者引用派生类虚函数返回派生类对象指针或者引用时,称为协变。...虽然函数名不相同,看起来违背了重写规则,其实不然,这里可以理解为编译器析构函数名称做了特殊处理,编译后析构函数名称统一处理成destructor。...调用就可以看出存是哪个函数 cout " << vTable << endl; for (int i = 0; vTable[i] !

1.3K10
领券