为什么子类的子类不能访问其祖先的受保护成员?

时间:2019-04-02 23:57:01

标签: c++ class

我有一个类size,有一个子类ObjectOutputStream,有一个子类Animal。类Dog有一个BigDog。我无法访问Animal类函数或构造函数中的protected int legs

legs

从BigDog设置或读取腿时,此代码给出“错误:'int Animal :: legs'受保护”

2 个答案:

答案 0 :(得分:4)

写作时

class Dog : Animal { … };

您真正在写的是

class Dog : private Animal { … };

因为用 class-key class定义的类的默认访问说明是private [class.access.base]/2(一种说法:如果您有{{ 1}},除非您另外明确声明,否则该类将继承所有内容以保持私有。私有继承意味着基类的所有受保护成员和公共成员在派生类中都是私有的。由于class私下继承了所有Dog的内容,因此Animal不再可以访问(顺便说一下,它也私下继承了所有BigDog的内容)。您最想写的是

Dog

class Dog : public Animal { … };

注意:如果您有class BigDog : public Dog { … }; ,则默认值为struct

答案 1 :(得分:2)

您正在使用私有继承,这意味着每个继承的成员都将变为私有。您想要公共继承。

import java.rmi.*;
import java.util.*;
import java.rmi.server.*;


public class ServiceServerImpl extends UnicastRemoteObject
    implements ServiceServer {

    HashMap serviceList;

    public ServiceServerImpl() throws RemoteException {
        setUpServices();
    }

    private void setUpServices() {
        serviceList = new HashMap();

    }

    public Object[] getServiceList() {
        System.out.println("in remote");
        return serviceList.keySet().toArray();       
    }

    public Service getService(Object serviceKey) throws RemoteException {
        Service theService = (Service) serviceList.get(serviceKey);
        return theService;
    }


    public static void main (String[] args) {

        try {

            Naming.rebind("ServiceServer", new ServiceServerImpl());   

        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
        System.out.println("Remote service is running");
    }

}

请在此处注意关键字class Dog : public Animal { ... class BigDog : public Dog { ,以确保公共成员保持公共状态,受保护成员也受到保护。继承的访问说明符指定任何继承成员的 maximum 可见性,因此,当它是私有成员时,所有内容都将是私有成员。并且,与public类的成员一样,如果您未指定,则继承将假定您表示私有。 on cppreference的更多内容。