我是C++的初学者.我遇到override了我正在处理的头文件中使用的关键字.我可以知道,真正的用途是什么override,或许用一个例子就很容易理解.
在过去的几周里,有些东西正在困扰我的大脑虚拟和覆盖.我已经了解到,当你使用虚函数进行继承时,你必须添加virtual以让编译器知道搜索正确的函数.之后我还了解到在c ++ 11中有一个新关键字 - 覆盖.现在我有点困惑; 我是否需要在程序中同时使用虚拟和覆盖关键字,或者最好只使用其中一个?
为了解释自己 - 我的意思的代码示例:
class Base
{
public:
virtual void print() const = 0;
virtual void printthat() const = 0;
virtual void printit() const = 0;
};
class inhert : public Base
{
public:
// only virtual keyword for overriding.
virtual void print() const {}
// only override keyword for overriding.
void printthat() const override {}
// using both virtual and override keywords for overriding.
virtual void printit() const override {}
};
Run Code Online (Sandbox Code Playgroud)
什么是最好的方法?
如果我有一个带有虚拟析构函数的基类.有一个派生类来声明一个虚拟析构函数吗?
class base {
public:
virtual ~base () {}
};
class derived : base {
public:
virtual ~derived () {} // 1)
~derived () {} // 2)
};
Run Code Online (Sandbox Code Playgroud)
具体问题:
之前可能已经问过这个问题,但是我无法找到类似的问题.
考虑以下类层次结构:
class BritneySpears
{
public:
virtual ~BritneySpears();
};
class Daughter1 : public BritneySpears
{
public:
virtual ~Daughter1(); // Virtual specifier
};
class Daughter2 : public BritneySpears
{
public:
~Daughter2(); // No virtual specifier
};
Run Code Online (Sandbox Code Playgroud)
Daughter1和Daughter2班级有区别吗?
指定/不指定virtual子类析构函数/方法会产生什么后果?
谢谢.
在C++中同时使用virtual和override使用函数是危险的吗?那是否会让你因重载而产生歧义?
显然,virtual必须在基类中使用,这将是愚蠢的,不使用override派生类,但它实际上是有问题的使用virtual 与 override在派生类?
试图确定这是一个风格或正确的问题.
例:
class Widget {
virtual void transmogrify() = 0;
}
class Gadget : public Widget {
virtual void transmogrify() override {}
}
Run Code Online (Sandbox Code Playgroud) 在理解切片之后,据我所知它可以使用指向动态变量的指针来破解.但是怎么了?为什么那时没有切片?我想自己,但我不确定.在ppet = pdog;分配之后,pdog指向ppet的相同地址.不是吗?
//Program to illustrate use of a virtual function
//to defeat the slicing problem.
#include <string>
#include <iostream>
using namespace std;
class Pet
{
public:
virtual void print();
string name;
};
class Dog : public Pet
{
public:
virtual void print();//Keyword virtual not needed, but put
//here for clarity. (It is also good style!)
string breed;
};
int main()
{
Dog vdog;
Pet vpet;
vdog.name = "Tiny";
vdog.breed = "Great Dane";
vpet = vdog;
//vpet.breed; is …Run Code Online (Sandbox Code Playgroud) 我刚刚犯了一个错误(我自己制作的!),其表现如下.我有一个带有虚拟成员函数的类,我需要通过为一些新的用例添加额外的参数来扩展它.我使用默认值添加它,这样它就不会破坏任何当前调用.我错过的是有一个继承自这个类的另一个类,它具有这个函数的覆盖,不再是一个覆盖.虽然我知道在添加新代码时要避免使用override关键字,但我想知道是否有任何方法可以找到所有在词法上足够接近可能出现类似错误的函数.做过这一次之后,我有可能在过去的某个时间做过这件事,并且想要追溯检查代码库.
实际上有必要使用or virtual 吗 override?
我知道关于这个一般性主题有很多问题,例如:
\n\n从这些以及其他标记为重复项的内容中(许多“重复项”的答案包含了至少对我来说是新的独特信息),我学到了一些东西(并且我认为,大致了解它们的原因) re true): 没有 virtual 的覆盖将无法编译。没有覆盖的虚拟将编译,但如果您犯了一个错误并且方法签名不正确,编译器不会告诉您。
\n\n但是如果我省略两者会发生什么?例子:
\n\nstruct BaseClass {\n int a_number() {\n return 1;\n }\n};\nstruct DerivedClass : BaseClass {\n int a_number() {\n return 2;\n }\n};\nRun Code Online (Sandbox Code Playgroud)\n\n这将编译并a_number返回适当的结果,无论我实例化BaseClass还是DerivedClass. 所以它的行为就好像我已经覆盖了该函数。上面的代码有错误吗?这是向后兼容性问题还是其他问题?
如果我错过的相关问题之一直接回答了这个问题,我深表歉意,谢谢。
\n\n编辑:StackOverflow 不断将我指向派生类中函数的 C++ \xe2\x80\x9cvirtual\xe2\x80\x9d 关键字。有必要吗?问题,正如威克在下面所做的那样。我不认为它解决了我的问题,因为我在评论中给了他/她,因为它们是暂时的,我将在这里重复:\n“我特别询问超类方法中的虚拟,虽然那篇文章似乎是关于子类中的 virtual 及其传播方式。下面接受的答案回答了我的问题,但我不认为你的链接可以回答(它可能会回答在 C/C++ 方面更有经验的人的问题,但我我不认为它能回答像我这样来自 Python 和 Java 的新手的问题)。”
\n\n要点: …