class 是为此创建的实例,派生的 class 在这段代码中做了什么?
For which class is the instance created and what is the derived class doing in this code?
派生的 class 在这段代码中做了什么,例如:
class Base
{
public:
virtual std::string Name(){ return "Base Class"}
};
class Derived : public Base
{
public:
std::string Name() {return "Derived Class"}
}
int main()
{
Base* object = new Derived();
return 0;
}
我正在学习教程,但不明白 Derived class 在 Base 的实例化中是什么 Class在上面的代码中做了。
修改 main
为:
int main()
{
Base* object = new Derived();
std::cout << object->Name() << std::endl;
return 0;
}
并添加 3 个缺失的“;”在你的代码中,你会看到写 Derived Class,被调用的方法 Name 是 [= 的真实类型之一38=]object 是 Derived.
请注意,虽然 Name 在 Base 中是 virtual,但它也在 Derived连你都没说清楚。
virtual
允许在应用方法时使用对象的 real 类型,因此即使 object 也是声明 Base 当 Name 是 virtual 被调用的版本是真实类型之一 派生
但是如果你在 Name 的 Base 的定义中删除 virtual
,那么写 Base Class 因为 object 被声明 Base 调用的方法是 Name 定义的在 基地.
在 Derived 上添加 virtual
的结果是相同的,但仍然在 Base 上删除它,因为对于编译器object 被声明为 Base 并且 Name 不是 virtual Base 调用时不考虑object
的真实类型
所以,有:
#include <iostream>
#include <string>
class Base
{
public:
virtual std::string virtualName(){ return "Base Class";}
std::string nonVirtualName(){ return "Base Class";}
};
class Derived : public Base
{
public:
std::string virtualName() {return "Derived Class";} // implicitely virtual
std::string nonVirtualName(){ return "Base Class";}
};
int main()
{
Base* object = new Derived();
std::cout << object->virtualName() << std::endl;
std::cout << object->nonVirtualName() << std::endl;
return 0;
}
编译与执行:
bruno@bruno-XPS-8300:/tmp$ g++ -Wall a.cc
bruno@bruno-XPS-8300:/tmp$ ./a.out
Derived Class
Base Class
bruno@bruno-XPS-8300:/tmp$
请注意,如果您在 main
末尾添加 delete object;
,并且由于默认析构函数不是 virtual,被调用的析构函数是 Base 完全适用于 nonVirtualName,而对于 Derived 什么都不做。在 Base 上定义析构函数 virtual 是正确的方法,这意味着析构函数至少是隐式的 virtual 在 Derived 上允许在 delete object;
上执行两个析构函数
目标是实现 polymorphism,它是一个 OOP 概念,除其他外,它允许您使派生的 class 方法覆盖基础 class.
考虑以下几点:
class Base {
public:
//virtual keyword allows method to be overriden
virtual std::string Name() { return "Base Class"; }
//virtual destructor needed for polymorphism otherwise it can lead to undefined behavior
virtual ~Base(){}
};
class Derived : public Base {
public:
//optional keyword override signal the method has been overriden
std::string Name() override { return "Derived Class"; }
};
class Derived2 : public Base {
public:
std::string Name() override { return "Derived Class 2"; }
};
int main() {
Base *object = new Derived();
Base *object2 = new Derived2();
Base *object3 = new Base();
//collection of objects of type Base* which can hold any class of the family
Base *collection[] = {object, object2, object3};
for (auto &obj : collection) {//test print
std::cout << obj->Name() << std::endl;
}
}
正如评论所解释的那样,我可以拥有同一系列的不同对象的集合,当您调用 Name()
时,方法调用将取决于对象。
输出:
Derived Class
Derived Class 2
Base Class
派生的 class 在这段代码中做了什么,例如:
class Base
{
public:
virtual std::string Name(){ return "Base Class"}
};
class Derived : public Base
{
public:
std::string Name() {return "Derived Class"}
}
int main()
{
Base* object = new Derived();
return 0;
}
我正在学习教程,但不明白 Derived class 在 Base 的实例化中是什么 Class在上面的代码中做了。
修改 main
为:
int main()
{
Base* object = new Derived();
std::cout << object->Name() << std::endl;
return 0;
}
并添加 3 个缺失的“;”在你的代码中,你会看到写 Derived Class,被调用的方法 Name 是 [= 的真实类型之一38=]object 是 Derived.
请注意,虽然 Name 在 Base 中是 virtual,但它也在 Derived连你都没说清楚。
virtual
允许在应用方法时使用对象的 real 类型,因此即使 object 也是声明 Base 当 Name 是 virtual 被调用的版本是真实类型之一 派生
但是如果你在 Name 的 Base 的定义中删除 virtual
,那么写 Base Class 因为 object 被声明 Base 调用的方法是 Name 定义的在 基地.
在 Derived 上添加 virtual
的结果是相同的,但仍然在 Base 上删除它,因为对于编译器object 被声明为 Base 并且 Name 不是 virtual Base 调用时不考虑object
所以,有:
#include <iostream>
#include <string>
class Base
{
public:
virtual std::string virtualName(){ return "Base Class";}
std::string nonVirtualName(){ return "Base Class";}
};
class Derived : public Base
{
public:
std::string virtualName() {return "Derived Class";} // implicitely virtual
std::string nonVirtualName(){ return "Base Class";}
};
int main()
{
Base* object = new Derived();
std::cout << object->virtualName() << std::endl;
std::cout << object->nonVirtualName() << std::endl;
return 0;
}
编译与执行:
bruno@bruno-XPS-8300:/tmp$ g++ -Wall a.cc
bruno@bruno-XPS-8300:/tmp$ ./a.out
Derived Class
Base Class
bruno@bruno-XPS-8300:/tmp$
请注意,如果您在 main
末尾添加 delete object;
,并且由于默认析构函数不是 virtual,被调用的析构函数是 Base 完全适用于 nonVirtualName,而对于 Derived 什么都不做。在 Base 上定义析构函数 virtual 是正确的方法,这意味着析构函数至少是隐式的 virtual 在 Derived 上允许在 delete object;
目标是实现 polymorphism,它是一个 OOP 概念,除其他外,它允许您使派生的 class 方法覆盖基础 class.
考虑以下几点:
class Base {
public:
//virtual keyword allows method to be overriden
virtual std::string Name() { return "Base Class"; }
//virtual destructor needed for polymorphism otherwise it can lead to undefined behavior
virtual ~Base(){}
};
class Derived : public Base {
public:
//optional keyword override signal the method has been overriden
std::string Name() override { return "Derived Class"; }
};
class Derived2 : public Base {
public:
std::string Name() override { return "Derived Class 2"; }
};
int main() {
Base *object = new Derived();
Base *object2 = new Derived2();
Base *object3 = new Base();
//collection of objects of type Base* which can hold any class of the family
Base *collection[] = {object, object2, object3};
for (auto &obj : collection) {//test print
std::cout << obj->Name() << std::endl;
}
}
正如评论所解释的那样,我可以拥有同一系列的不同对象的集合,当您调用 Name()
时,方法调用将取决于对象。
输出:
Derived Class
Derived Class 2
Base Class