use*_*100 10 c++ base-class derived-class
class Material
{
public:
void foo()
{
cout << "Class Material";
}
};
class Unusual_Material : public Material
{
public:
void foo()
{
cout << "Class Unusual_Material";
}
};
int main()
{
Material strange = Unusual_Material();
strange.foo(); //outputs "Class Material"
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望这导致"Class Unusual_Material"显示在控制台上.有没有办法实现这个目标?在我的程序中,我有一个类材料,从中可以得到其他更具体的材料.方法Material :: foo()表示Material中适用于大多数材料的方法,但是在某种程度上,需要为具有不寻常属性的材料定义另一个foo().
程序中的所有对象都包含一个Material字段.如果他们被分配了一个不寻常的材料,我希望调用派生的,不寻常的foo.
这可能要么很简单,要么不可能,但无论如何我无法弄明白.
谢谢
In *_*ico 20
你想要的是多态,并为你需要的功能启用它virtual:
class Material
{
public:
virtual void foo() // Note virtual keyword!
{
cout << "Class Material";
}
};
class Unusual_Material : public Material
{
public:
void foo() // Will override foo() in the base class
{
cout << "Class Unusual_Material";
}
};
Run Code Online (Sandbox Code Playgroud)
此外,多态只适用于引用和指针:
int main()
{
Unusual_Material unusualMaterial;
Material& strange = unusualMaterial;
strange.foo();
return 0;
}
/* OR */
int main()
{
Unusual_Material unusualMaterial;
Material* strange = &unusualMaterial;
strange->foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您的代码段中包含的内容将切片Unusual_Material对象:
int main()
{
// Unusual_Material object will be sliced!
Material strange = Unusual_Material();
strange.foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)