精华内容
下载资源
问答
  • 子类调用父类方法

    千次阅读 2021-01-12 19:09:51
    子类调用的属性方法在子类中不存在时,那么this和super都是调用父类的属性或者方法1.方式一子类调用父类的方法,包含2中形式的调用。一种形式是在类内部通过继承的方式调用父类的方法,另外一种形式是子类实例化后...

    当有相同的属性或者方法是this子类表示调用自己的属性或者方法,

    super调用父类的属性或者方法。

    当子类调用的属性方法在子类中不存在时,那么this和super都是调用父类的属性或者方法

    1.方式一

    子类调用父类的方法,包含2中形式的调用。一种形式是在类内部通过继承的方式调用父类的方法,另外一种形式是子类实例化后之后通过继承的方式来调用父类的方法。如下图所示:

    注意一点,在子类内部通过继承的方式调用父类的属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来的含义就是指向实例自己));而实例在通过继承调用父类的属性或方法时,则不用传self参数,因为实例已经实例化了呀!!!

    该部分的代码块如下:注意一点,在子类内部通过继承的方式调用父类的属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来的含义就是指向实例自己));而实例在通过继承调用父类的属性或方法时,则不用传self参数,因为实例已经实例化了呀!!!

    该部分的代码块如下:

    class Person():

    "人的类"

    def __init__(self,name,age,sex):

    self.name = name

    self.age = age

    self.sex = sex

    def eat(self):

    print("%s开始吃饭了"%self.name)

    class Student(Person):

    "学生类"

    def __init__(self,name,age,sex,classnaem):

    #子类调用父类的构造函数进行初始化

    Person.__init__(self,name,age,sex) #通过子类把参数传给父类(self不能少,self只有在实例化和实例调用类时才能省略,此处不是)

    self.classnaem = classnaem

    def course(self):

    print("%s在%s上课"%(self.name,self.classnaem))

    def done(self):

    print("这个学生在干嘛?")

    #子类调用父类方法

    Person.eat(self) #子类在调用父类方法必须要传self

    #实例化一个子类

    student = Student("周明",23,'男',"11届土木3班")

    #调用子类本身的方法

    student.course()

    #通过子类调用父类的方法--->实例化之后来调用父类的方法

    student.eat()

    #调用子类的方法,在子类方法中调用了子类的方法,与student.eat有区别

    student.done()

    此时如果父类的名称更改了,那么在子类中所有用到父类名的地方均要进行修改了。所有此种方法不便于后期维护,为此我们选择方式二。

    2.方式二

    使用super来代替父类名,以方便代码的后期维护,见下图:

    使用super的好处,一是可以代替父类名,这样后期父类名更改了,我们只需要更改子类名称后面的父类名即可,子类中其他的父类名可以不用更改;二是使用了super后,调用父类方法时可以不传参数self。

    该部分的代码块为:

    class Person():

    "人的类"

    def __init__(self,name,age,sex):

    self.name = name

    self.age = age

    self.sex = sex

    def eat(self):

    print("%s开始吃饭了"%self.name)

    class Student(Person):

    "学生类"

    def __init__(self,name,age,sex,classnaem):

    #子类调用父类的构造函数进行初始化

    # Person.__init__(self,name,age,sex) #通过子类把参数传给父类(self不能少,self只有在实例化和实例调用类时才能省略,此处不是)

    #使用super来替换父类名

    super().__init__(name,age,sex) #通过子类把参数传给父类,用super可以省略self

    self.classnaem = classnaem

    def course(self):

    print("%s在%s上课"%(self.name,self.classnaem))

    def done(self):

    print("这个学生在干嘛?")

    #子类调用父类方法

    super().eat() #子类在调用父类方法,使用super可以省略self

    #实例化一个子类

    student = Student("周明",23,'男',"11届土木3班")

    #调用子类本身的方法

    student.course()

    #通过子类调用父类的方法--->实例化之后来调用父类的方法

    student.eat()

    #调用子类的方法,在子类方法中调用了子类的方法,与student.eat有区别

    student.done()

    参考:https://www.cnblogs.com/a8457013/p/8438490.html

    展开全文
  • 利用多态机制,一个指向子类父类指针或引用,当调用被子类重写的虚函数时,实际上调用的是子类函数,这是通过多态的方式来实现父类调用子类,该方法需要一个引用或者指针调用函数来实现。如下面所示: Class ...

    父子类关系

    对于继承关系中的父类和子类,我们可以说子类是父类的一种,子类继承了父类的属性和行为。因此,子类可以访问父类的所有非私有成员。相反,父类一般情况下是不能访问子类成员的。然而,我们可以通过一些方法间接的实现父类访问子类,即父类函数访问子类函数。

    方法一

    利用多态机制,一个指向子类的父类指针或引用,当调用被子类重写的虚函数时,实际上调用的是子类函数,这是通过多态的方式来实现父类调用子类,该方法需要一个引用或者指针调用虚函数来实现。如下面所示:

    Class Base
    {
    public:
        virtual void fun()
        {
            std::cout << "Base::fun()" << std::endl;
        }
    };
    
    class Derived : public Base
    {
    public:
        virtual void fun()
        {
            std::cout << "Derived::fun()" << std::endl;
        }
    };
    
    Base* base = new Derived;
    base->fun();    //该结果输出为: "Derived::fun()"

    上面简单的例子就是通过多态实现的父类调用子类成员函数,这里面必须要有虚函数,并且在子类里面重写。

    方法二

    通过函数指针同样可以实现父类函数访问子类函数,示例代码如下:

    class Base
    {
    public:
        typedef void (Base::*pfn)();
    
        void CallFunction()
        {
            if(fn != NULL)
            {
                (this->*fn)();  //调用Derived类中的fun()函数
            }
        }
        void SetPfn(pfn fn)
        {
            this->fn = fn;
        }
    
    private:
        pfn fn;
    
    };
    
    class Derived : public Base
    {
    public:
        void Init()
        {
            SetPfn((pfn)&Derived::fun);
        }
    
        void fun()
        {
            std::cout << "Derived::fun be called in Base function!" << std::endl;
        }
    
    };
    
    Derived derived;
    derived.Init();
    derived.CallFunction();//这里调用的是父类的成员函数,该函数通过函数指针调用了子类的普通成员函数,调用结果输出:"Derived::fun be called in Base function!",即父类成员函数调用了子类成员函数。
    
    

    程序执行结果如下:

    这里写图片描述

    展开全文
  • 父类函数子类中直接可以用,如果担心歧义可以使用作用域标识符:: 如果子类重写了父类函数,而此时想要使用父类函数则必须使用作用域标识符::

    父类的(public和protect的)函数在子类中直接可以用,如果担心歧义可以使用作用域标识符::
    如果子类重写了父类的函数,而此时想要使用父类的函数则必须使用作用域标识符::

    展开全文
  • __init__(self, ...)可以将父类中的init中的属性重复调用,减少代码的重复class Vehicle:def __init__(self, name, speed, load, power):self.name = nameself.speed = speedself.load = loadself.power = powerdef...

    父类名 . __init__(self, ...)

    可以将父类中的init中的属性重复调用,减少代码的重复

    class Vehicle:

    def __init__(self, name, speed, load, power):

    self.name = name

    self.speed = speed

    self.load = load

    self.power = power

    def run(self):

    print('%s我开动啦'%self.name)

    class Subway(Vehicle):

    def __init__(self,name, speed, load, power,line):

    Vehicle.__init__(self, name, speed, load, power)

    self.line = line

    def show_info(self):

    print(self.name, self.line)

    line1 = Subway('郑州地铁', '30m/s','500','电', '1号')

    line1.show_info() #调用自身的方法

    line1.run() #调用父类中的类方法

    父类名 . 函数名(self)

    子类中调用父类中类方法的逻辑

    class Vehicle:

    def __init__(self, name, speed, load, power):

    self.name = name

    self.speed = speed

    self.load = load

    self.power = power

    def run(self):

    print('%s我开动啦'%self.name)

    class Subway(Vehicle):

    def __init__(self,name, speed, load, power,line):

    Vehicle.__init__(self, name, speed, load, power)

    self.line = line

    def show_info(self):

    print(self.name, self.line)

    def run(self):

    Vehicle.run(self) #加上这句,可以实现同名函数,调用父类中的逻辑

    print('%s我来自子类'%self.line)

    line1 = Subway('郑州地铁', '30m/s','500','电', '1号线')

    line1.show_info() #调用自身的方法

    line1.run()

    super 方法

    调用父类逻辑时,不用担心类名的变动

    class Vehicle:

    def __init__(self, name, speed, load, power):

    self.name = name

    self.speed = speed

    self.load = load

    self.power = power

    def run(self):

    print('%s我开动啦'%self.name)

    class Subway(Vehicle):

    def __init__(self,name, speed, load, power,line):

    # Vehicle.__init__(self, name, speed, load, power)

    super().__init__(name, speed, load, power) #super 方法,这样就不用担心类名被修改

    self.line = line

    def show_info(self):

    print(self.name, self.line)

    def run(self):

    # Vehicle.run(self) #加上这句,可以实现同名函数,调用父类中的逻辑

    super().run() #效果和上面代码一样,更适合

    print('%s我来自子类'%self.line)

    line1 = Subway('郑州地铁', '30m/s','500','电', '1号线')

    line1.show_info() #调用自身的方法

    line1.run() #调用父类中的类方法

    super().__init__(name, speed, load, power) 等同于:

    super(Subway, self).__init__(name, speed, load, power)

    展开全文
  • } JAVA:使用super调用父类的读域函数getAge() Person.java package test; public class Person { public Person(int age) { this.aAge = age; } public int getAge() { return aAge; } public void setAge(int age)...
  • 因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建...
  • c++ 子类对象调用父类的方法

    千次阅读 2021-03-08 20:37:26
    第一种方式就是子类重写父类的方法,在子类中定义和父类同样的方法,方法体中调用父类的方法 父类代码 #pragma once #include "CClientSocket.h" class CTCPInterface { public: CTCPInterface(); ~...
  • //最后的输出为上课了 } } 我以为,在子类Person的getAction中使用super关键字调用父类的action方法,然后在父类的action方法中又使用了this关键字调用了beforeAction方法,这个时候this指向的不应该是父类Person...
  • 一、父类指针指向子类对象 先上代码: class Base { public: void base_fun1() {} virtual void base_fun2() { cout << "this is Base fun2()" << endl; } public: int a_a; protected: int a...
  • 结论:父类指针可以指向子类对象,但是只能访问父类成员,不能访问子类成员 结论:子类指针不可以指向父类对象,需要类型转换才可以 笔记: <1>.当基类指针指向派生类的时候,只能操作派生类从基类中继承...
  •  其实这块我们需要分为两种情况来考虑,第一种是类继承(静态绑定),第二种是父类中包含虚函数(动态绑定)。 2 具体实现 2.1 没有虚函数的继承  如果以一个基础类指针指向一个派生类对象,那么经由该指针只能...
  • C++——子类调用父类方法 原创声明:本文系博主原创文章,转载或引用请注明出处。 1. 如果类B是类A的子类,则在类B的成员方法中调用类A的方法时,可以直接以A::method(paramlist);来调用。 2. 若子类B重写...
  • 2、子类父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion_name。 3、子类父类参数不同,函数名相同,有...
  • php中子类调用父类的构造方法的方法是:可以通过parent关键字来实现。parent是指向父类指针,本质上就是代表父类这个类,而...(推荐教程:php教程)一般我们使用parent来调用父类的构造函数,如parent::__constru...
  • // 方法1:虚构函数 //virtual ~AnimalC() //{ // cout << "call ~AnimalC(虚析构函数)" << endl; //} // 方法2 纯虚析构函数,!!! 除了声明外还需要在外部写函数体 !!!!! .
  • 即:没有虚函数的继承:如果一个基础类(父类指针指向派生类(子类),那么该指针只能调用基础类(父类)定义的函数(如果子类重写了函数,那么因为定义的是父类指针掉的将会是父类函数,即根据指针的原型来确定...
  • 文章目录虚析构函数父类指针指向子类对象||子类指针指向父类对象总结: 虚析构函数 《Effective C++ 》 当派生类(derived class)对象由一个基类(base class)指针删除时,若基类有一个非虚函数(non-virtual)...
  • 这里之所以要调用父类的构造函数,是因为子类在继承父类的属性时,子类在内存空间中有一块内存是用来存放父类的属性的,所以需要调用父类的构造函数来对它初始化。如果父类的构造函数没有被重载,那么子类就会调用...
  • 拷贝构造函数 浅拷贝: 使用系统默认的拷贝构造函数,有bug,...父类名::函数名 --》指定调用父类的同名函数 多继承和多重继承 多继承 1.多继承: 跟单继承相对的一个概念,一个子类继承了多个父类,这种就叫做多继承
  • 父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数; 当父类子类有同名虚函数的时候呢,调用的是指针转换前指向的对象类型的函数。 #include <iostream> using namespace std; class Base ...
  • 之前一直以为 this关键字 是指调用者对象,但是这次才真正理解,this代表当前对象,但是指向调用者对象,其实就是多态的用法,如下所示:B 继承了 A,在B 中调用A类的方法,在A 中用this 访问成员变量和方法,此时,...
  • 子类父类的关系

    2021-03-01 19:15:23
    子类父类的关系 什么是子类型 ​ 公有继承时,派生类的对象可以作为基类的对象处理,派生类是基类的子类型。 #include <iostream> using namespace std; class A { public: A() {} ~A() {} void ...
  • c++父类调用子类的方法

    千次阅读 2021-05-31 17:22:42
    在c++中,父类子类函数都有对应的虚函数表,如果子类重写了虚函数,就会将新写的这个函数的地址放到他自己的表内,并且通过父类指针指向子类所开辟的空间,这样就可以调用子类的方法 方法二:强转转换 但是有...
  • //调用重写的方法 } } Java 子类继承父类成员中的问题 之前搞错了,变量没有“重写”一说,只有方法才能被“重写”.如果我们在子类中声明了一个和父类中一样的变量,那么实际的情况是,子类的内存堆中会有类型和名字都...
  • c++默认根据指针类型调用对应的函数 非多态demo c++中的多态通过虚函数实现(virtual修饰) 虚函数实现demo 虚函数实现原理 汇编分析 内存分析 父类指针指向子类对象 父类指针指向子类对象,是安全的的...
  • 展开全部这个是我很e5a48de588b63231313335323631343130323136353331333264643162早之前学习到“多态”时候整理的笔记。送你了!希望对你有用!...继承是为了重用父类代码,同时为实现多态性作准备。那么什么...
  • 子类继承父类时, ...定义他为虚函数是为了允许用基类的指针调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个
  • class A { public: A() { printf("A \n"); } ~A() { printf(" ~A \n"); }// 这里不管写不写...因为这个例子是B*指针指向B对象,不是A*指针指向B对象。 }; class B : public A { public: B() { printf("B \n"); } .
  • 1、代码 package main import "fmt" type MyInterface interface { PrintSelf() } type MyInstance struct { MyInterface } ... //父类调用子类方法 Inf.(interface{ PrintSpecial() }).PrintSpecial() } 2、输出

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 127,933
精华内容 51,173
关键字:

子类调用父类函数指针