我定义了两个类,基类,人。和派生类客户。 在派生类中,我重写了display()方法。 但是我想在客户实例中调用基类(person)的显示方法。 我该如何处理?
我在msdn中知道,有一些使用base()
调用的例子,但是我的问题不是在类定义中调用,而是在实例调用中调用。我认为这是不同的。
using System;
using System.Text;
class Program
{
static void Main(string[] args)
{
person myperson = new person();
myperson.DisplayInfo();
customer mycustomer = new customer();
mycustomer.DisplayInfo();
// --here I want to invoke person.display(). how to realize it?
//mycustomer.base.DisplayInfo();
}
public class person
{
public string Name="base name";
public virtual string DisplayInfo()
{
string msg = Name;
Console.WriteLine(msg);
return msg;
}
}
public class customer : person
{
public new void DisplayInfo()
{
Console.WriteLine("derive "+ Name);
}
}
}
答案 0 :(得分:1)
由于您只是使用new
来隐藏基本成员,因此您可以使用
(mycustomer as person).DisplayInfo();
调用基本方法,但我不考虑这种良好做法。
答案 1 :(得分:0)
通常,当您覆盖基本方法时,您仍然希望在派生方法中运行基本方法
像:
public override void DisplayInfo()
{
//call base method
base.DisplayInfo();
//add your extra code here
}
如果要在不运行派生逻辑的情况下运行基本方法 在派生类中添加另一个方法来调用你需要的基本方法
会很容易public void RunBaseDisplayInfo()
{
base.DisplayInfo();
}
答案 2 :(得分:0)
您的父类可以保存您的子类的实例。 根据你的例子,这样做有效。
#include <windows.h>
#include <algorithm>
#include <iostream>
#include <vector>
#include <memory>
void printVectorSmartPointers(std::vector<std::unique_ptr<int>> &vSmartPointers) {
std::cout << "vector of smart pointers of int: ";
for (std::vector<std::unique_ptr<int>>::const_iterator it = vSmartPointers.begin(); it != vSmartPointers.end(); it++)
std::cout << ' ' << **it;
std::cout << '\n';
}
int main(int argc, char* argv[]) {
std::unique_ptr<int> smartPointer1 = std::make_unique<int>(1);
std::unique_ptr<int> smartPointer2 = std::make_unique<int>(1);
std::unique_ptr<int> smartPointer3 = std::make_unique<int>(3);
std::vector<std::unique_ptr<int>> vectorSmartPointers;
vectorSmartPointers.push_back(std::move(smartPointer1));
vectorSmartPointers.push_back(std::move(smartPointer2));
vectorSmartPointers.push_back(std::move(smartPointer3));
printVectorSmartPointers(vectorSmartPointers);
vectorSmartPointers.erase(
std::remove_if(
vectorSmartPointers.begin(),
vectorSmartPointers.end(),
[](std::unique_ptr<int> const &p) { return *p == 1; }),
vectorSmartPointers.end());
printVectorSmartPointers(vectorSmartPointers);
Sleep(50000);
return 0;
}