在c#中使用父类型的子构造函数时会发生什么?父项x=新的子项();

在c#中使用父类型的子构造函数时会发生什么?父项x=新的子项();,c#,inheritance,C#,Inheritance,有些人有时在创建父类实例时使用子构造函数,如: Parent x = new Child(); 在这种实例化中,x对象只能访问父属性和方法,不能访问子类的任何成员,只能访问用virtual关键字声明并在子类中重写的成员 我的问题是:这个对象的实例化是否有任何性能问题 当使用这种方法实例化对象时,会发生什么 我在Microsoft文档中找不到。 我看了一个关于设计模式的视频课程,SOLID Principle部分的老师说,这种使用虚拟关键字和覆盖关键字的方法是消除违反Liskov替换的方法。好吧

有些人有时在创建父类实例时使用子构造函数,如:

Parent x = new Child();
在这种实例化中,x对象只能访问父属性和方法,不能访问子类的任何成员,只能访问用virtual关键字声明并在子类中重写的成员


我的问题是:这个对象的实例化是否有任何性能问题

当使用这种方法实例化对象时,会发生什么

我在Microsoft文档中找不到。
我看了一个关于设计模式的视频课程,SOLID Principle部分的老师说,这种使用虚拟关键字和覆盖关键字的方法是消除违反Liskov替换的方法。

好吧,你的问题很一般,所以我将用类似的方法来解决这个问题

简而言之,如果我没弄错的话,您正在搜索您正在做的事情:

BaseClass obj = new DerivedClass();
假设
DerivedClass
扩展了
BaseClass

这是一个非常普遍使用的概念,因为它是一个基本的特征。 声明父类变量,并指定派生类对象实例化

如果您觉得这听起来很奇怪,请从继承的角度考虑:
DerivedClass
对象实际上也是
BaseClass
对象。 简单地说:卡车、汽车和自行车也是车辆。 因此,在实践中,您可以使用
BaseClass
变量来指向
DerivedClass
对象

从那时起使用
obj
变量,编译器通常不会(我把任何类型的工具或特定的优化放在一边,坚持基本原则)“知道” obj主要“派生”类是“派生类”。查看此以了解更多信息

这是因为这是在提供一些功能时确定的。例如,派生类中任何重写的方法实现等现在都将在运行时根据名为的概念确定。所以,, 调用
obj.myDerivedMethod()
(存在于派生类和基类中,具有不同的实现)将调用大部分派生类型的方法实现

这样,您就可以在运行时实现对许多事情的评估和确定,而无需事先了解所有事情

提到“绩效”,答案是“视情况而定”。你想做什么

一般来说,与编译时相反,在运行时执行的操作通常在执行时间、资源等方面代价高昂。另一方面,通常这之后会有许多优化,您遵循的是OOP范式,导致更干净的代码,更接近真实世界范式(同样,这不是唯一的现代编程范式)


然而,造成“问题”并不是我的想法。这是一个范例,不仅支持C++,而且几乎所有面向对象语言,如java、C++等等。有很多事情你可以错误地在这上面做“导致性能问题”,但是我不认为通过将派生类实例实例化到基类变量而发现问题。面向对象。

A将非常棒。让我问你一个反问题。为什么您认为它的性能问题?“这个对象的实例化有任何性能问题吗?”与什么相比?本问题假设存在提供相同功能但运行速度更快的任何替代方案。那么您想要什么功能呢?表达式所指定的变量类型对构造函数的调用方式没有任何影响
Child x=new Child()
调用完全相同的代码。关于虚拟方法和非虚拟方法之间的差异,已经有很多文章;这是另一件事,不需要在这里重提。