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

成员变量多态性 我从C++开始,我很难使用多态性,尤其是当我想在新类的构造函数中使用它时。我知道这个问题已经得到了处理,但我不理解,我的情况有点不同

成员变量多态性 我从C++开始,我很难使用多态性,尤其是当我想在新类的构造函数中使用它时。我知道这个问题已经得到了处理,但我不理解,我的情况有点不同,c++,polymorphism,C++,Polymorphism,为了了解如何使用它,我构建了这个小程序。以下是main.cpp: 最后是src.cpp文件: 我想: I'm a car I'm a sportcar I'm a sportcar I'm a sportcar 我尝试使用这样的引用: protected: Car &m_Car; Track m_Track; 但它也不起作用,我有一个无法修复的错误: ||=== Build: Debug in test (compiler: GNU GCC Compiler) ===

为了了解如何使用它,我构建了这个小程序。以下是main.cpp:

最后是src.cpp文件:

我想:

I'm a car
I'm a sportcar
I'm a sportcar
I'm a sportcar
我尝试使用这样的引用:

protected:
    Car &m_Car;
    Track m_Track;
但它也不起作用,我有一个无法修复的错误:

||=== Build: Debug in test (compiler: GNU GCC Compiler) ===|
E:\documents\c++\test\src\src.cpp||In constructor 'Race::Race(const Car&, Track)':|
E:\documents\c++\test\src\src.cpp|46|error: uninitialized reference member in 'class Car&' [-fpermissive]|
include\headers.h|66|note: 'Car& Race::m_Car' should be initialized|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

感谢您的帮助。

问题是,必须按照错误消息所指出的那样初始化引用。要在构造函数中执行此操作,我们使用


编辑:MyRotro不需要在这里初始化,但如果可能的话,总是使用初始化列表,这是一个很好的实践,而且它也更有效。

< P>注意,C++中,初始化以某种方式创建对象,如STD::String STR= HI;赋值改变现有对象的值,如str=hi;这是两件不同的事情

当你写一个构造函数时,比如

Car::Car(double s)
{
     m_Speed = s;
}
C++需要对象及其所有成员都存在,因此在到达第一个对象时已经初始化{MyList= s;语句是赋值而不是初始化。因为没有指定MyLoad应该如何初始化,C++插入逻辑默认在构造函数体启动之前初始化它,虽然对于双类型的基本类型,这意味着它在赋值之前有一个不确定的值。 对于double类型的成员来说,这通常并不重要,但对于类类型的成员来说,这是可以的,对于引用类型的成员来说,这是肯定的:引用必须初始化,因为引用必须总是引用某个对象,而左手边是引用变量的赋值总是赋值给引用的对象;因此e不能改变引用所指的对象

指定构造函数如何初始化成员的方法是使用成员初始化器列表:

Car::Car(double s)
    : m_Speed(s)
{}

Race::Race(const Car& c, Track t)
    : m_Car(c), m_Track(t)
{
    m_Car.Show();
}
尽可能使用成员初始值设定项列表是一个好习惯,但在这里您遇到了一个绝对需要的情况

[注1:由于另一个问题,上面显示的Race构造函数仍然无法正常工作:您无法从const Car初始化Car&引用。您需要将构造函数更改为采用非const参数,或者将成员更改为具有const Car&类型。非const参数还可以避免绑定到tem的潜在问题临时的。]


[注2:为类成员指定初始值设定项的另一种方法是在类内的成员声明后放置=something;。当构造函数未为该成员指定初始值设定项时,将使用此默认初始值设定项,如果有隐式定义的默认构造函数,则使用此默认初始值设定项。如果需要多个结构使用相同的初始值设定项。]

@由于问题现在已发布,我得到的结果和我想要的结果都以相同的方式写入。编辑,谢谢@Joey为什么不将m_Track=t;移动到初始化列表m_Track t?这样会更有效。好的,我理解,谢谢,它可以工作,但我必须删除常量以避免以下错误:E:\documents\c++\test\src\src.cpp | 46 |错误:从'const Car'类型的表达式初始化'Car&'类型的引用无效|啊,错过了。已更新。
protected:
    Car &m_Car;
    Track m_Track;
||=== Build: Debug in test (compiler: GNU GCC Compiler) ===|
E:\documents\c++\test\src\src.cpp||In constructor 'Race::Race(const Car&, Track)':|
E:\documents\c++\test\src\src.cpp|46|error: uninitialized reference member in 'class Car&' [-fpermissive]|
include\headers.h|66|note: 'Car& Race::m_Car' should be initialized|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Race::Race(Car& c, Track t) : m_Car(c), m_Track(t)
{
    m_Car.Show();
}
Car::Car(double s)
{
     m_Speed = s;
}
Car::Car(double s)
    : m_Speed(s)
{}

Race::Race(const Car& c, Track t)
    : m_Car(c), m_Track(t)
{
    m_Car.Show();
}