- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设我们有一个抽象类NonEditableSuperBase
,我们从中创建另一个抽象类MyBase
。
第一个类NonEditableSuperBase
有一个虚函数(非纯虚函数)。但是,我想强制如果有人创建一个派生自 MyBase
的类,他/她必须提供上述函数的实现。
因此,我的想法是在MyBase
中将函数定义为纯虚函数。
我的问题:这是个坏主意吗,因为它在 NonEditableSuperBase
中只是虚拟的?
示例:
//NonEditableSuperBase.h
class NonEditableSuperBase
{
...
public:
virtual int someMethod(); //It has an implementation, suppose {return 42;}
};
//MyBase.h
class MyBase: public NonEditableSuperBase
{
public:
explicit MyBase();
virtual ~MyBase() = default;
virtual int someMethod() = 0; //I make it pure virtual
};
//MyBase.cpp
MyBase::MyBase() : NonEditableSuperBase() { }
//Now someone creates a derived class from MyBase.
class SuperDerived : public MyBase
{
public:
explicit SuperDerived();
int someMethod(); //The user must create an implementation of the function
};
更新:例如,在我的例子中,我想从 QAbstractTableModel 创建一些派生类Qt框架的类。为了重用一些代码,我想创建一个中间抽象类。
QAbstractTableModel <- MyAbstractModel <- MyModelA (or MyModelB ... etc).
但是,我想确保模型(MyModelA、MyModelB)重新实现 QAbstractTableModel 的一些虚函数(如::index() 函数),因为 MyAbstractModel 的一些附加方法需要特定的实现入门功能。
最佳答案
来自 ISO IEC 14882 2014 :
§ 10.4 says:
5 [ Note: An abstract class can be derived from a class that is not abstract, and a pure virtual function mayoverride a virtual function which is not pure. —end note ]
所以完全有可能做到这一点。
用例示例:
你可以有一个基本类型,它被实现为一个具体类型(基类)。现在,对于子类型,我们可能需要进一步的附加信息。因此,我们可以有一个抽象的中间对象来满足我们的需求。
关于c++ - 创建虚函数的纯虚函数是否危险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43143733/
编辑:澄清一下,我明白为什么这段代码不起作用,我并不是要修复它,而是想了解如果这段代码可以在没有语义错误的情况下编译会有什么危险。 我发现下面的代码会导致静态语义错误。我知道这是因为 std::lis
我想知道 C# 枚举以及重复值会发生什么。我创建了以下小程序来测试: namespace ConsoleTest { enum TestEnum { FirstElem
正如我在另一个 SO 问题中指出的那样,我遇到了 this article .当我通过 MSVC7.1 编译 boost 1.40 时出现了这个问题,并且弹出了几个 C4251 警告。 现在,在阅读上
我有以下弹出窗口代码(客户端请求)。它使用 eval ,我知道这是危险的。有没有办法重写下面的脚本,使其不使用 (eval)? /* exported popup_default , popup_he
NTFS 文件可以有对象 ID。可以使用 FSCTL_SET_OBJECT_ID 设置这些 ID .然而,msdn article说: Modifying an object identifier c
我一直在学习命令行参数解析。关于这个已经有很长的线索了,我不想在这里挑起一个: Using getopts in bash shell script to get long and short com
这个问题在这里已经有了答案: How to configure ContextMenu buttons for delete and disabled in SwiftUI? (4 个回答) 4 个月
为什么在 linux 的中断处理程序中禁止 printk 或 (I/O)。?在什么情况下中断处理程序中的 I/O 会导致 linux 系统中的死锁? 最佳答案 关于 printk(),它是侵入性的。例
不是 Invoking virtual function and pure-virtual function from a constructor 的重复项: 以前的问题与 C++ 03 相关,而不是
我正在使用 lateinit 属性以避免使用 ?运算符(operator)。我有很多 View 属性是第一次在 getViews() 函数中分配的。如果该功能不存在,我的应用程序将与来自 Kotlin
我最近在使用 fputs 时遇到了问题:当使用 fputs 在文本文件中打印一些字符串时,我碰巧得到了除 A-Z、a-z、0-9 之外的其他字符(不属于字符串的字符) .我绝对确保所有字符串都以空字符
在仅包含字节数组的结构上使用 #pragma pack(1) 是否危险/有风险?例如。这个: #pragma pack(1) struct RpcMessage { uint8_t proto
我是一名优秀的程序员,十分优秀!