标签: polymorphism

类型类中的非法多态或限定类型

以下文件Poly.hs文件

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE RankNTypes #-}
module Poly () where

type ListModifier s = forall a. s -> [a] -> [a]

instance Monoid (ListModifier s) where
  mempty = const id
  mappend f g st = f st . g st
Run Code Online (Sandbox Code Playgroud)

获取要注意的类型检查器:

Poly.hs:8:10: Illegal polymorphic or qualified type: ListModifier s …
    In the instance declaration for ‘Monoid (ListModifier s)’
Compilation failed.
Run Code Online (Sandbox Code Playgroud)

最初我虽然它不能组成2级类型但是:

?> :t (undefined :: forall a . a -> String …
Run Code Online (Sandbox Code Playgroud)

polymorphism haskell

0
推荐指数
1
解决办法
66
查看次数

为什么我需要在子类中重新声明`virtual`方法?[C++/Polymorphism]

有人可以解释一下,如果我们有一个带有virtual成员函数的抽象类,为什么我们需要在子类中再次声明它?例如,请参见下面的示例

抽象类

.h文件

#ifndef ALGORITHM_H
#define ALGORITHM_H

#include <vector>
#include "Event.h"

using std::vector;

class Algorithm{
protected:
  vector<Event>* dataset;
public:
  Algorithm(vector<Event>& dataset);
  virtual ~Algorithm();

  virtual void run() = 0;
};

#endif
Run Code Online (Sandbox Code Playgroud)

.cpp文件

#include "../include/Algorithm.h"

Algorithm::Algorithm(vector<Event>& dataset):dataset(&dataset){}
Algorithm::~Algorithm(){}
Run Code Online (Sandbox Code Playgroud)

鉴于run声明纯虚函数,通过扩展此类,我的期望是它只需要实现.但是,它仍然需要在类中声明扩展此抽象类.

子类

.h文件

#ifndef SELECT_ALGORITHM_RANDOM_H
#define SELECT_ALGORITHM_RANDOM_H

#include "Algorithm.h"

class SelectAlgorithmRandom : public Algorithm{
public:
  SelectAlgorithmRandom(vector<Event>& dataset);
  ~SelectAlgorithmRandom();

  void run(); // <-- why do I need this here, and doesn't it defy the purpose of me …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism

0
推荐指数
1
解决办法
70
查看次数

C++销毁基类导致调试断言失败

我正在尝试学习更多关于多态的知识,我试图让它变得尽可能简单,所以我得到了基类图和2个派生类Rectangle和Circle.

class Figure {
public:
    Figure() { cout << "Creating Figure\n"; }
    virtual ~Figure() { cout << "Destroying Figure\n"; }

    virtual double calculateField() {
            return 0;
    }
};

class Rectangle : public Figure
{
public:
    Rectangle(double m_a) : p_a(m_a) { cout << "Creating Rectangle\n"; }
    ~Rectangle() { cout << "Destroying Rectangle\n"; }

    virtual double calculateField() {
        return p_a*p_a;
    }

private:
    double p_a; 
};

class Circle : public Figure
{
public:
    Circle(double m_r) : p_r(m_r) { cout << "Creating Circle\n"; } …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism virtual

0
推荐指数
1
解决办法
75
查看次数

为什么有些Haskell函数不抽象具体的整数类型?

例如,函数length抽象具体的sequence(Foldable),但不抽象具体的整数类型Int:

length :: Foldable t => t a -> Int
Run Code Online (Sandbox Code Playgroud)

拥有以下类型签名会更有用或更方便吗?

length' :: Foldable t, Integral i => t a -> i
Run Code Online (Sandbox Code Playgroud)

polymorphism haskell types

0
推荐指数
1
解决办法
86
查看次数

无法使用dynamic_cast从Base转换为Derived

当我尝试将基类转换为派生类时,我收到错误.我想访问我放在组件向量中的派生类.

//基础和派生

class Component
{
public:
    Component();
    virtual ~Component();
private:
};

class Material:public Component{...};
Run Code Online (Sandbox Code Playgroud)

//在主要

int textureID = gameScene.gameObjects[0].getComponent<Material>()->texture;
Run Code Online (Sandbox Code Playgroud)

//游戏对象

#pragma once
#include <vector>
#include "Component.h"

class GameObject:public Component
{
public:
    GameObject();
    GameObject(int otherAssetID);
    ~GameObject();

    int assetID;
    std::vector<Component> components;

    void addComponent(Component otherComponent);
    void deleteComponent(Component otherComponent);

    template <class T>
    T* getComponent() {
        for (int i = 0; i < components.size(); i++)
        {
            if (dynamic_cast<T*>(components[i]) != nullptr)
            {
                T *test = dynamic_cast<T*>(components[i]);
                return test;
            }
        }

        return nullptr;
    }
private:

};
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism dynamic-cast game-engine

0
推荐指数
1
解决办法
398
查看次数

为什么在运行时需要虚拟表来调用虚函数?

我下面这个教程,试图了解virtual table背后的整个过程pointervirtual functions in C++.

不确定,当我有这样的代码:

D1 d1;
Base *dPtr = &d1;
dPtr->function1();
Run Code Online (Sandbox Code Playgroud)

为什么我需要所有这些virtual table管理?为什么编译器根本不分配内存地址d1(或基数,如果没有)覆盖virtual function

我的意思是:如果它需要D1 functon1()地址或Base functon1()地址,它可以在编译时详细说明.它当时知道.为什么以后在运行时看到会浪费时间和资源virtual tables

我想念这一点.花哨的例子?

c++ polymorphism virtual-functions virtual-table

0
推荐指数
1
解决办法
86
查看次数

如何创建多个子类级别,以便参数属于子类?

在这个StackOverFlow问题之后,让我们说我想扩展到另一个级别的子类,比如Mallards,我该怎么做?

public abstract class Animal <A extends Animal<A>>
{
    public abstract A copyAnimal(A animal);
}

public class Duck extends Animal<Duck>
{
    @Override
    public Duck copyAnimal(Duck duck)
    {
        return copyOfDuck;
    }
}

class Mallard extends Duck<Mallard>
{
    public Mallard copyAnimal(Mallard mallard)
    {
        return copyOfMallard;
    }   
}
Run Code Online (Sandbox Code Playgroud)

一切都适用于Duck子类,但它对于Mallard子类来说是失败的.如何使用未确定数量的子类进行设置?

java generics polymorphism

0
推荐指数
1
解决办法
37
查看次数

关于'Num'的算术运算的规则

常量在Haskell中是多态的.所以当我写:

foo = 5
Run Code Online (Sandbox Code Playgroud)

这个去掉了:

foo = fromInteger 5
Run Code Online (Sandbox Code Playgroud)

但是如果添加算术表达式呢?

foo = 42 - 15
Run Code Online (Sandbox Code Playgroud)

究竟是什么会被贬低?

foo = fromInteger (42 - 15)
Run Code Online (Sandbox Code Playgroud)

要么

for = fromInteger 42 - fromInteger 15
Run Code Online (Sandbox Code Playgroud)

另外,观察这个最简单可靠的方法是什么?

polymorphism haskell constants

0
推荐指数
1
解决办法
61
查看次数

在异构Rust集合中使用Any trait对象有什么问题?

在像Clojure这样的动态语言中,很容易表达不同类型的集合:

{:key1 "foo", :key2 [34 "bar" 4.5], "key3" {:key4 "foobar"}}
Run Code Online (Sandbox Code Playgroud)

在Rust中,实现此类集合的首选方法是使用特征对象或枚举.使用Any特征对象似乎是最灵活的方法(如果没有固定数量的已知类型替代方法),因为它允许向下转换为实际的对象类型:

let mut vector: Vec<Box<Any>> = Vec::new();
vector.push(Box::new("I’m"));
vector.push(Box::new(4 as u32));
console!(log, vector[0].downcast_ref::<&str>());
console!(log, vector[1].downcast_ref::<u32>());
Run Code Online (Sandbox Code Playgroud)

这种方法似乎是不鼓励的.它的缺点是什么?

collections polymorphism traits rust

0
推荐指数
1
解决办法
157
查看次数

对象成员变量还是继承?

我一直在练习继承,我发现自己在问一个"有一个"关系是什么.

如果我有一个类circleType,我想创建一个类cylinderType,什么派生的区别cylinderTypecircleType,只是包括circleType在定义对象成员cylinderType

class cylinderType :
public circleType
{
public:
    cylinderType();
    ~cylinderType();

private:
    double * height;
};
Run Code Online (Sandbox Code Playgroud)

要么:

class cylinderType
{
public:
    cylinderType();
    ~cylinderType();

private:
    circleType baseOfCylinder;
};
Run Code Online (Sandbox Code Playgroud)

c++ oop polymorphism inheritance

0
推荐指数
1
解决办法
42
查看次数