代码之家  ›  专栏  ›  技术社区  ›  bjskishore123

根据继承用法,下列哪项是不允许的?

c++
  •  0
  • bjskishore123  · 技术社区  · 14 年前

    here ,

    使用继承时,下列哪项是不允许的

    a) 更改子类在父类中的操作实现

    c) 子类在父类中使用属性

    e) 没有

    5 回复  |  直到 14 年前
        1
  •  6
  •   Alexander Rafferty    14 年前

    答案是没有。

        2
  •  4
  •   Justin Niessner    14 年前

    我认为答案是A。

    您可以重写实现(如果操作被声明为 virtual

    考虑以下几点:

    class Parent
    {
        public:
            virtual void sayHello() { count << "Hello World!"; }
    }
    
    class Child : Parent
    {
        public:
           void sayHello() { cout << "42!"; }
    }
    

    现在看看结果:

    // Will still say "Hello World!" because our child can never 
    // change the parent's implementation
    Parent* parent1 = new Parent();
    parent1->sayHello();
    
        3
  •  1
  •   dgnorton    14 年前

    a-父操作可以重写(在某种意义上被替换),但不能更改。

    #include <iostream>
    
    class A {
    public:
       A() {}
       virtual ~A() {}
       virtual void foo() {
          std::cout << "Hi, I'm A" << std::endl;
       }
    };
    
    class B : public A {
    public:
       B() {}
       virtual ~B() {}
       virtual void foo() {
          std::cout << "Hi, I'm B" << std::endl;
       }
    };
    
    int main() {
       A* a = new B();
       a->foo();
    
       return 1;
    }
    

    Hello, I'm B
    

    B::foo()重写了A::foo(),但没有更改它。


    是的,子类可以使用父类中方法的实现。例如,如果我们将上面代码中的B::foo()方法更改为。。。

    virtual void foo() {
       A::foo();  // <--------------------------NOTE the addition of this call
       std::cout << "Hi, I'm B" << std::endl;
    }
    

    …程序将打印。。。

    Hi, I'm A
    Hi, I'm B
    

    c-子类可以使用 受保护的 父类的属性,但不是 私有的 属性。例如:

    #include <iostream>
    
    class A {
    public:
       A() : pub(1), pro(2), pri(3) {}
       virtual ~A() {}
       virtual void foo() {
          std::cout << "Hi, I'm A" << std::endl;
       }
    
       int pub;
    
    protected:
    
       int pro;
    
    private:
    
       int pri;
    };
    
    class B : public A {
    public:
       B() {}
       virtual ~B() {}
       virtual void foo() {
          std::cout << pub << std::endl;
          std::cout << pro << std::endl;
          std::cout << pri << std::endl;  // <----COMPILE ERROR
       }
    };
    
    int main() {
       A* a = new B();
       a->foo();
    
       return 1;
    }
    

    由于子类B试图访问父类的私有成员,因此该代码在上面提到的行中将有一个编译错误。如果另一个类被声明为 朋友 但是你应该很少,如果有的话,使用friend关键字。


    是的,子类可以有父类没有的操作。例如:

    #include <iostream>
    
    class A {
    public:
       A() {}
       virtual ~A() {}
       virtual void foo() {
          std::cout << "Hi, I'm A" << std::endl;
       }
    };
    
    class B : public A {
    public:
       B() {}
       virtual ~B() {}
       virtual void foo() {
          std::cout << "Hi, I'm B" << std::endl;
       }
    
       virtual void otherFunc() {
          std::cout << "I'm a function that my parent class doesn't have." << std::endl;
       }
    };
    
    int main() {
       B b;
       A& a = b;
    
       a.foo();
       a.otherFunc();  // <--- COMPILE ERROR
    
       b.foo();
       b.otherFunc();  // <--- OK
    
       return 1;
    }
    

    在上面的例子中, 其他函数()


    最好的学习和确定的方法是在编译器中尝试这些东西。尝试上面的代码。我在visualstudio2008中测试了它。没有显式标记为COMPILE ERROR的示例应该可以工作。

        4
  •  0
  •   Steven    14 年前

    我想我知道贾斯汀是怎么说A项的,但在他的例子中,继承是一条红鲱鱼,我认为他在寻找一个不存在的窍门。

    创建具有重写行为的子级不会影响父级 如果不使用孩子 ,但这似乎不言而喻。如果您将父级的parent1实例改为使用子级的构造函数,我想您会看到A点将得到确认。

        5
  •  0
  •   Tony Delroy    14 年前

    使用继承时,下列哪项是不允许的 a) 更改子类在父类中的操作实现

    这是不允许的。您可以重写虚拟函数,这样子类对象在通过指向基类的指针或引用进行访问时,可以运行它们自己的函数实现,但不能阻止基类实例运行其正常实现。

    (从技术上讲,如果基类定义了成员函数模板,您可以定义一个新的专门化,它将从定义的角度影响到翻译单元的结束,但这是一个令人讨厌的黑客行为,而不是真正意义上的模板)。

    这只允许用于公共/受保护的成员,而不允许用于私有成员。

    c) 子类在父类中使用属性

    d) Having操作是父类中不存在的子类

    这是明确允许的,也是不可能限制的。