Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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/7/rust/4.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++ - Fatal编程技术网

怀疑在施工人员中工作的一个缺点 我在读谷歌C++风格指南,在这部分中感到困惑。在施工中进行繁重工作的缺点之一是:

怀疑在施工人员中工作的一个缺点 我在读谷歌C++风格指南,在这部分中感到困惑。在施工中进行繁重工作的缺点之一是:,c++,C++,如果工作调用虚拟函数, 这些呼叫将不会被分派到 子类实现。未来 修改你的类可以安静地进行 即使您的 类当前不是子类, 引起很多混乱 我不明白这是什么意思。有人能解释一下为什么这会被认为是一个缺点吗?当构造一个对象时,首先调用基类的构造函数。由于派生类尚未初始化,因此在基类构造函数期间对虚拟方法的任何调用都不会使用派生类对象 构造函数的工作只是初始化对象的初始状态。如果您开始执行依赖于在虚拟函数中执行的操作的任务,当子类开始实现这些函数时,您可能会得到一些意外的结果。如果您从类继承,则在这种情况下

如果工作调用虚拟函数, 这些呼叫将不会被分派到 子类实现。未来 修改你的类可以安静地进行 即使您的 类当前不是子类, 引起很多混乱


我不明白这是什么意思。有人能解释一下为什么这会被认为是一个缺点吗?

当构造一个对象时,首先调用基类的构造函数。由于派生类尚未初始化,因此在基类构造函数期间对虚拟方法的任何调用都不会使用派生类对象

构造函数的工作只是初始化对象的初始状态。如果您开始执行依赖于在虚拟函数中执行的操作的任务,当子类开始实现这些函数时,您可能会得到一些意外的结果。

如果您从类继承,则在这种情况下将不会调用您重写/实现的方法。所以,如果Employee在构造函数中调用work(),那么稍后您将得到Hourly::work()和SalariedEmployee::work(),这些函数将不会被调用。即使它们有不同的实现,它们仍将被视为雇员,而不是它们的特殊实现。

创建子类的实例时,首先称为基类的构造函数,然后称为子类的构造函数

如果基类构造函数调用虚方法,那么将调用基类的方法而不是子类,尽管实例是子类的实例。这可能是个问题


这里有更多信息:

我公然从维基百科页面上摘取一些示例代码:

#包括
#包括
类动物{
公众:
虚空eat()常量{

Std::Po>虚拟函数调用不是虚拟的行为定义很好,但非常令人惊讶,所以编译器通常发出警告。

这是我不喜欢谷歌C++风格指南的原因之一。你有一个很好的理由,可以在代码审查中为其辩护。另一方面,建议使用两步初始化(可以论证)错误的是,许多其他样式指南建议不要两步初始化…记住谷歌的样式指南是针对C++的,尽管页面标题是不允许的,它们提供了一种BastaldEdage语言,其中许多C++习语要么不能使用,要么被剥夺它们的有用性。这就是它们需要两个阶段的原因。初始化,以及由此带来的所有容易出错的麻烦;没有办法表明构造函数失败。除非你有特定的理由遵循谷歌的风格,否则就忽略它。
#include <iostream>
#include <vector>

class Animal {
    public:
        virtual void eat() const { 
            std::cout << "I eat like a generic Animal." << std::endl; 
        }
        virtual ~Animal() { 
        }
};

class Wolf : public Animal {
    public:
        void eat() const { 
            std::cout << "I eat like a wolf!" << std::endl; 
        }
};

class Fish : public Animal {
    public:
        void eat() const { 
            std::cout << "I eat like a fish!" << std::endl; 
        }
};